Vue 组件传递对象采用 keep-alive 与 localStorage 对比.md

Vue 组件传递对象采用 keep-alive 与 localStorage 对比

两个 vue 组件,A 与 B,A通过路由的方式跳转到B,需要向B传递数据,我们这里传递的数据是由对象组成的数组,也就是引用类型变量。本篇文章的 A 是始终缓存的,也就是始终keepAlive === true。

A页面时一个简单的商品列表及购物车页面:

在这里插入图片描述

A中点击提交按钮会跳转到B,B是展示订单的页面:

在这里插入图片描述

我们主要考虑可能的用户操作,1.A页面中点击提交按钮路由到B,2.前进后退导航,3.手动刷新页面。看看这些情况下会有怎样的效果。

一、最普通的情况下,A路由跳转到B。
<router-link :to="{ path: '/order',query:{ items: baskets }}"></router-link>
// 这里的 baskets 是 [{},{}]类型

B中在created生命钩子函数获取数据

this.items = this.$route.query.items;

A 是否缓存B是否缓存B何时获取数据点击提交按钮前进后退导航刷新页面
truefalsecreatedB中同步更新B中数据丢失B中数据丢失
二、B也应用keep-alive,仍在 created时获取数据
A 是否缓存B是否缓存B何时获取数据点击提交按钮前进后退导航刷新页面
truetruecreatedB返回到A,修改A中数据,再跳转到B,B中数据不更新B页面缓存B中数据丢失
三、B应用 keep-alive,但是在 activated时获取数据, activated将会再keep-alive组件激活时使用
A 是否缓存B是否缓存B何时获取数据点击提交按钮前进后退导航刷新页面
truetrueactivatedB返回到A,修改A中数据,再跳转到B,B中数据同步更新B页面数据不会缓存B中数据丢失
四、应用 localStorage,B不应用keep-alive,created时获取数据
/**
* @method beforeRouteLeave
* @description 跳转到 Order 路由时,把购物车数据存储到 localStorage 中
*/
beforeRouteLeave(to, from, next) {
		try{
			if(localStorage.hasOwnProperty('items')){
					localStorage.removeItem('items');
			}
			if(to.path.indexOf('/order') !== -1){
				localStorage.setItem('items', JSON.stringify(this.baskets));	
			}
		}catch(err){
				throw new Error(err);
		}
		next();
	}
A 是否缓存B是否缓存B何时获取数据点击提交按钮前进后退导航刷新页面
truefalsecreatedB返回到A,修改A中数据,再跳转到B,B中数据同步更新B页面数据缓存,且更新B中数据不丢失,且更新
五、应用 localStorage,且B应用keep-alive,created时获取数据
A 是否缓存B是否缓存B何时获取数据点击提交按钮前进后退导航刷新页面
truetruecreatedB返回到A,修改A中数据,再跳转到B,B中数据不更新B页面数据缓存,不更新B中数据不丢失,且更新
六、应用 localStorage,且B应用keep-alive,activated时获取数据
A 是否缓存B是否缓存B何时获取数据点击提交按钮前进后退导航刷新页面
truetrueactivatedB返回到A,修改A中数据,再跳转到B,B中数据同步更新B页面数据缓存,且更新B中数据不丢失,且更新

通过四与六,我们发现,在应用了 loaclStorage 且 B不应用 keep-alive之后,A与B页面的数据时紧紧绑定的,B返回到A,修改了A中的数据,不论是通过点击提交按钮,还是前进后退导航,B中的数据都与A中同步。如果B中应用了 keep-alive 的话,那么就需要在 activated 中来获取数据,才能保证点击数据的同步。

总结:

1.对于引用型变量在组件之间通过路由传递,例如A->B,可以通过在A中使用 beforeRouteLeave 来将数据添加到localStorage 中,使得组件的数据是同步的。

2.在 1 的情况下,如果希望缓存 B 页面的话,需要在B中activated钩子函数来获取数据,才能保证引用类型数据的同步。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue的选项式组件转换为组合式组件的过程需要注意一些细节,但大体上可以按照以下步骤进行: 1. 将模板代码移动到一个单独的.vue文件中,并将其命名为Tabs.vue。 2. 在Tabs.vue文件中,将模板代码包裹在一个template标签中,并将v-model指令绑定到一个名为“modelValue”的prop。这个prop将用于在组合式组件中跟踪当前选中的选项卡。 ``` <template> <div> <v-tabs class="tabs" fixed-tabs color="primary" v-model="modelValue"> <v-tab>招聘信息</v-tab> <v-tab> 简历 </v-tab> </v-tabs> <keep-alive> <slot :key="$route.fullPath"></slot> </keep-alive> </div> </template> ``` 3. 在同一个Tabs.vue文件中,将data选项替换为一个setup函数,并将其中的数据属性“tab”替换为一个ref对象“modelValue”。 ``` <script> import { ref, onActivated, onBeforeRouteLeave } from 'vue'; export default { props: { modelValue: { type: Number, default: 0, }, }, setup(props) { const modelValue = ref(props.modelValue); onActivated(() => { const savedTab = localStorage.getItem('activeTab'); if (savedTab) { modelValue.value = Number(savedTab); } }); onBeforeRouteLeave((to, from, next) => { localStorage.setItem('activeTab', modelValue.value); next(); }); return { modelValue, }; }, }; </script> ``` 在这个setup函数中,我们首先使用Vue的ref函数创建一个名为“modelValue”的响应式对象,并将其初始值设置为从prop中传入的值。我们还使用Vue的onActivated和onBeforeRouteLeave钩子来处理组件的激活和离开事件。在onActivated钩子中,我们从本地存储中加载上次选定的选项卡,并将其设置为“modelValue”的值。在onBeforeRouteLeave钩子中,我们将当前选定的选项卡保存到本地存储中,以便在返回时恢复用户的选项卡选择。 最后,在模板中使用Vue的slot标签来定义插槽,以便在父组件中插入子组件。在这种情况下,我们使用了一个匿名插槽,将其绑定到一个名为“$route.fullPath”的动态key上,以便在切换路由时强制重新渲染子组件,以便正确恢复选项卡的状态。 将这个组合式组件在父组件中使用时,您可以像这样绑定modelValue属性: ``` <template> <div> <tabs v-model="activeTab"> <template #default> <router-view /> </template> </tabs> </div> </template> <script> import Tabs from './Tabs.vue'; export default { components: { Tabs, }, data() { return { activeTab: 0, }; }, }; </script> ``` 在这个例子中,我们将Tabs组件导入到父组件中,并将其注册为局部组件。然后,我们使用v-model指令将父组件的“activeTab”变量绑定到组件的“modelValue”prop上。在组件内部,选项卡的状态将由“modelValue”ref对象跟踪和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值