pinia 状态管理的作用

把 Pinia 想成 “全家共享的冰箱”

  1. 没有冰箱(没有状态管理)
    每个组件就像各自的小房间,
    饿了只能在自己房间翻零食:

    • 房间 A 想拿房间 B 的薯片?得一层层传话,麻烦。
    • 零食过期了也互相不知道。
      在这里插入图片描述
  2. 有了冰箱(Pinia)
    把**所有需要共享的零食(数据)**统一放到客厅的大冰箱里:

    • 任何房间(组件)随时开门拿、关门放,随拿随改
    • 冰箱自带“保质期提醒”(响应式),谁改了东西,所有房间立刻知道。
    • 冰箱分门别类(store),饮料一层、水果一层,不乱。
  3. 实际代码对应

    // 定义冰箱的一层:counterStore
    export const useCounter = defineStore('counter', () => {
      const count = ref(0);          // 共享零食
      const double = computed(() => count.value * 2); // 派生零食
      function inc() { count.value++; }               // 改零食
      return { count, double, inc };
    });
    
    // 房间 A 想吃
    const counter = useCounter();
    counter.inc();        // 改冰箱
    console.log(counter.double);
    
    // 房间 B 立刻看到新数量
    const counter2 = useCounter();
    console.log(counter2.count); // 同步更新
    

一句话总结:
Pinia 就是 “把多个组件都要用到的数据放到一个统一、响应式的地方”
省掉层层传递和同步的麻烦,让数据一处改,处处更新

pinia 状态管理和直接使用ref的区别

那么pinia 状态管理和直接使用ref的区别是什么呢
一句话先说结论:
ref 是“房间私用小抽屉”,Pinia 是“客厅公共大冰箱”。

对比点 ref/reactive 直接写 Pinia 状态管理
归属 只属于当前组件 跨组件共享
刷新同步 自己变,别人看不到 一处改,处处更新
层级传递 需要 props / emit 层层搬运 直接拿,不用传
持久化/调试 刷新页面就丢,难调试 有 DevTools、插件可做持久化、时光旅行
代码组织 散落在各组件 集中在一个 store,易维护
适用场景 局部、仅本组件用的数据 全局或跨组件共享的数据

举个最小例子:

  1. 直接 ref

    // 组件A
    const count = ref(0);
    // 组件B 想拿?拿不到!
    
  2. Pinia

    // store/counter.ts
    export const useCounter = defineStore('counter', () => {
      const count = ref(0);
      return { count };
    });
    
    // 组件A
    const counter = useCounter();
    counter.count++;
    
    // 组件B
    const counter = useCounter();
    console.log(counter.count); // 同步看到最新值
    

所以:

  • 数据只在本组件用 → ref/reactive 就够了。
  • 数据要给兄弟、孙子、全局用 → 用 Pinia。

ps:源于kimi生成,仅作整理记录

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐