当前位置:网站首页>如何保存页面的当前的状态
如何保存页面的当前的状态
2022-08-08 04:35:00 【无知小九】
如何保存页面的当前的状态
既然是要保持页面的状态(其实也就是组件的状态),那么会出现以下两种情况:
- 前组件会被卸载
- 前组件不会被卸载
那么可以按照这两种情况分别得到以下方法:
组件会被卸载:
(1)将状态存储在LocalStorage / SessionStorage
只需要在组件即将被销毁的生命周期 componentWillUnmount (react)中在 LocalStorage / SessionStorage 中把当前组件的 state 通过 JSON.stringify() 储存下来就可以了。在这里面需要注意的是组件更新状态的时机。
比如从 B 组件跳转到 A 组件的时候,A 组件需要更新自身的状态。但是如果从别的组件跳转到 B 组件的时候,实际上是希望 B 组件重新渲染的,也就是不要从 Storage 中读取信息。所以需要在 Storage 中的状态加入一个 flag 属性,用来控制 A 组件是否读取 Storage 中的状态。
优点
- 兼容性好,不需要额外库或工具。
- 简单快捷,基本可以满足大部分需求。
缺点
- 状态通过 JSON 方法储存(相当于深拷贝),如果状态中有特殊情况(比如 Date 对象、Regexp 对象等)的时候会得到字符串而不是原来的值。(具体参考用 JSON 深拷贝的缺点)
- 如果 B 组件后退或者下一页跳转并不是前组件,那么 flag 判断会失效,导致从其他页面进入 A 组件页面时 A 组件会重新读取 Storage,会造成很奇怪的现象
(2)路由传值
通过 react-router 的 Link 组件的 prop —— to 可以实现路由间传递参数的效果。
在这里需要用到 state 参数,在 B 组件中通过 history.location.state 就可以拿到 state 值,保存它。返回 A 组件时再次携带 state 达到路由状态保持的效果。
优点
- 简单快捷,不会污染 LocalStorage / SessionStorage。
- 可以传递 Date、RegExp 等特殊对象(不用担心 JSON.stringify / parse 的不足)
缺点
- 如果 A 组件可以跳转至多个组件,那么在每一个跳转组件内都要写相同的逻辑。
组件不会被卸载:
(3)单页面渲染
要切换的组件作为子组件全屏渲染,父组件中正常储存页面状态。
优点
- 代码量少
- 不需要考虑状态传递过程中的错误
缺点
- 增加 A 组件维护成本
- 需要传入额外的 prop 到 B 组件
- 无法利用路由定位页面
除此之外,在Vue中,还可以是用keep-alive来缓存页面,当组件在keep-alive内被切换时组件的activated、deactivated这两个生命周期钩子函数会被执行
被包裹在keep-alive中的组件的状态将会被保留:
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</kepp-alive>
router.js
{
path: '/',
name: 'xxx',
component: ()=>import('../src/views/xxx.vue'),
meta:{
keepAlive: true // 需要被缓存
}
},
边栏推荐
- 【多任务CTR】阿里ESMM:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conve
- 类似Bugfree的9大在线缺陷管理软件
- 国内最主流的5大项目工时管理系统
- [Graph Basics] How to Define Few-Shot Learning on Heterogeneous Graphs: Heterogeneous Graph Few-Shot Learning
- 基于扰动观察法的光伏mppt最大功率控制matlab仿真
- Qt 事件学习参考的一些优秀博客推荐
- L3-007 ladder map (test point 2 is stuck, you can see it)
- 拒绝“内卷”跃迁软件测试最大门槛,我是如何从月薪8K到15K的?
- fail-fast 和 fail-safe 快速学习
- NetCore uses Dapper to query data
猜你喜欢

【opencv】opencv开发包简介

MySQL4(多表查询)

一行代码统计文本中指定字符串出现的次数

unity之粒子特效制作图片拼合文字效果

2022-08-07 mysql/stonedb慢SQL-子查询-半连接

NetCore使用Dapper查询数据

y90.第六章 微服务、服务网格及Envoy实战 -- 服务网格基础(一)

Machine Learning Notes: Learning Rate Warmup

C语言-分值和循环语句

Risk control strategy must be learned | This method of mining rules with decision trees
随机推荐
The storage principle of NorFlash
32. Do you know how Redis strings are implemented?
Leetcode78. 子集
MySql入门教程
XDR技术
牛客多校第6场赛后学习 B(两种做法)G(两种做法)M(两种写法)J
亚马逊云科技Build On学习心得
The sword refers to Offer 18. Delete the node of the linked list
【多任务模型】《Multi-Faceted Hierarchical Multi-Task Learning for a Large Number of Tasks with Multi-dimens
MySQL - Indexes and Transactions
Strong Net Cup 2019 - Casual Bet (Stacked Injection)
硬盘基础知识
How to play knowledge graph in recommender system
KD树应用汇总
一行代码统计文本中指定字符串出现的次数
Inside outside l think MindSpore AI framework, heavy industry gathering, huawei big extraordinary path of the model
L3-007 ladder map (test point 2 is stuck, you can see it)
由联合体union引出的大小端问题
New User Plane Design and Key Technologies in the 6G Era
向往的开源之多YOUNG新生 | 从开源到就业的避坑指南来啦!