VUE缓存(切换页面保留选中条目)PINIA状态管理

Pinia 是 Vue 官方推荐的状态管理库,用来在多个组件之间 共享和管理数据。

为什么需要 Pinia?

在 Vue 项目中,如果你:
有 多个组件需要共享相同数据(比如当前选中的条目)
或者想让一个状态在 页面跳转后依然保留
想要让数据管理 更清晰、更可控

// store/selectedItem.ts
import { defineStore } from 'pinia';

export const useSelectedItemStore = defineStore('selectedItem', {
  state: () => ({
    currentSelectedItem: null
  }),
  actions: {
    setSelectedItem(item) {
      this.currentSelectedItem = item;
    }
  }
});

ps:这里面this相当于store对象本身
在这里插入图片描述
在组件中获取选中项

const store = useSelectedItemStore();
const selected = store.currentSelectedItem; // 获取选中项

在销毁改组件时清空缓存 置空

onUnmounted(() => {
store.setSelectedItem(null);
});

在父组件中改变子组件的打开挂载值

子组件.value.setItem(store.currentSelectedItem)

子组件中

const setItem = (item) => {
	currentItem.value = item;
}
defineExpose({
    currentItem,
    setItem,
  });

为什么要通过调用子组件中的方法来实现子组件的更新
而不是直接赋值
leftTreeRef.value.currentItem = store.currentSelectedItem

这个方法表面上没错,但实际问题在于:子组件中的 currentItem 是 ref({}),直接赋值 ref.value.currentItem = xxx,并不会触发视图更新
因为只是改了 ref 里的属性,而不是通过子组件自身的逻辑去更新。
在 leftTree.vue 中暴露一个方法,比如叫 setSelectedItem,在方法里执行 currentItem.value = item;,确保同时更新视图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值