服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Pinia

日期: 来源:冰岩作坊收集编辑:可乐

Pinia(菠萝)是Vue官方团队推荐替代Vuex的轻量级状态管理解决方案。

设计理念是让Vue拥有Composition API 风格的状态管理库,支持Vue3的setup Composition API,并完整支持ts,探索 Vuex 的下一次迭代。

对比vuex

  • 提供了更简单、符合组合式 API 风格的 API

  • 弃用mutations;actions中可以异步操作或者同步修改state,可以作为常规的函数调用,而不是使用dispatch或者MapAction

  • 完整的TS支持,友好的devTools支持

  • 不再有嵌套结构的模块modules,支持多个stores,pinia提供的是一个扁平的stores结构,但仍然能够嵌套调用 stores 空间。

stores

Options API

// options stores
export const useCounterStore = defineStore("counter", {
  state: () => {
    return { count: 1 };
  },
  // 也可以这样定义
  // state: () => ({ count: 0 })
  getters: {
    double: (state) => {
      return state.count * 2;
    },
  },
  actions: {
    increment() {
      this.count++;
    },
  },
});

Composition API

对应关系:

  • state--ref

  • getter--computed

  • action--functions

// setup stores
import { computed, ref } from "vue";
export const useCounterStore = defineStore("counter", () => {
  const count = ref(0);
  const double = computed(() => {
    return count.value * 2;
  });
  function increment() {
    count.value++;
  }

  return { count, increment, double };
});

// 调用其它stores的数据
export const useCounterStore = defineStore("counter", () => {
  const count = ref(0);
  const value = computed(() => {
    const otherStore = useOtherStore();
    return otherStore.count * 2165;
  });

  return { count, value };
});

在组件中使用

import { useCounterStore } from './pinia/index.js';

// 直接获取对象
const counter = useCounterStore();

let func = () => {
  counter.count++;
  counter.increment();

  console.log(counter.count);
}

// 解构获取state, getters, actions
// store是一个reactive包装的对象
const { count } = storeToRefs(counter);
// action 可以直接提取
const { increment } = counter;
let func = () => {
  count.value++;  // ref
  increment();
  console.log("count.value", count.value);
}

counter.$patch({ 
    count: counter.count + 1,
    a:123,
 });

counter.$reset();

mutations

在vuex中,我们通过提交 mutation 的方式,而非直接改变 store.state.count,是因为我们想要更明确地追踪到状态的变化

此外,这样也让我们有机会去实现一些能记录每次状态改变,保存状态快照的调试工具。有了它,我们甚至可以实现如时间穿梭般的调试体验。

vuex为什么要区分mutations和actions

官方文档说明:“在 mutations 中混合异步调用会导致你的程序很难调试。例如,当你能调用了两个包含异步回调的 mutations 来改变状态,你怎么知道什么时候回调和哪个先回调呢?这就是为什么我们要区分这两个概念。在 Vuex 中,我们将全部的改变都用同步方式实现。我们将全部的异步操作都放在 Actions 中。”

事实上在 vuex 里面 actions 只是一个架构性的概念,并不是必须的,说到底只是一个函数,你在里面想干嘛都可以,只要最后触发 mutations 就行。vuex 真正限制你的只有 mutations 必须是同步的这一点(在 redux 里面就好像 reducer 必须同步返回下一个状态一样)。

同步的意义在于这样每一个 mutations 执行完成后都可以对应到一个新的状态(和 reducer 一样),这样 devtools 就可以打个 snapshot 存下来,然后就可以随便 time-travel 了。

如果你开着 devtool 调用一个异步的 actions,你可以清楚地看到它所调用的 mutations 是何时被记录下来的,并且可以立刻查看它们对应的状态。


所以只要能知道什么时候改变state (commit mutation) 然后去 snapshot 那个时候的 state,就能追踪到状态的变化,就不需要mutations,只需要保留一个用来异步操作的action.


https://www.zhihu.com/question/48759748/answer/112823337

https://segmentfault.com/q/1010000008640002


相关阅读

  • Kotlin中Lambda表达式及其简化

  • 在Kotlin编程中,lambda表达式的应用非常常见,这篇文章用来介绍一下怎样用lambda表达式定义函数,用lambda表达式进行函数传参,以及简化lambda表达式参考文档: https://developer.
  • 浅谈JS函数式编程

  • 高效搬砖——拆分、组合、复用我们不妨以一个栗子开始:这是Scott Sauyet所著《Favoring Curry》中一个在项目实战里遇到的问题。var data = { result: "SUCCESS", inte
  • 第三集

  • 保存好这个动态更新的链接:http://qr61.cn/o56VsO/qlp4iXO(或者点击左下角阅读原文)百度云:https://pan.baidu.com/s/1w915FD5Xcm_EqK9xer66lQ?pwd=agin 如果需要提取码就是agin
  • 《瑞克和莫蒂》第六季第四集最新消息

  • 《瑞克和莫蒂》官方发布了第六季第四集的预告片,预计双语成片北京时间周二中午发布。这一集叫做Night Family《深夜一家人》,源自科幻剧《夜间画廊》(Night Gallery)。这部科幻
  • 读库二十二条好汉,奉上二十二份推荐

  • 春节将至,读库也将开启放假模式。作为这一年的总结,我们向同事们发起了一份年度书单征集。为顾全大局,避免出现大家只谈论自家产品这种其乐融融的场面,我们做了小小的限定,只能推
  • 梵高的秋 | 跟着名画吃水果

  • 水果时节水果是大自然最甜蜜的语言。在这个丰收的季节,水果以其甘甜滋润着万物,也启迪了人们。荷兰中部小镇蒂尔盛产苹果、梨、覆盆子、樱桃等水果,享有“荷兰果园”的美称。这

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • Pinia

  • Pinia(菠萝)是Vue官方团队推荐替代Vuex的轻量级状态管理解决方案。设计理念是让Vue拥有Composition API 风格的状态管理库,支持Vue3的setup Composition API,并完整支持ts,探索 V
  • 浅谈明日方舟肉鸽

  • 观前提示本期分享较为个人向与粉丝向,对于一些从来没有接触相关内容的读者来说或许会感到疑惑,但笔者会尽力讲清楚这次的分享内容,希望给大家带来良好的阅读体验引言首先简单的
  • Kotlin中Lambda表达式及其简化

  • 在Kotlin编程中,lambda表达式的应用非常常见,这篇文章用来介绍一下怎样用lambda表达式定义函数,用lambda表达式进行函数传参,以及简化lambda表达式参考文档: https://developer.
  • 利用Spine制作简单2D骨骼动画

  • hi!这里是一个关于游戏中2D骨骼动画的小小分享。 在2D游戏中,我们经常可以看见各式各样的角色动画。动画能给游戏带来生机和灵气。创作一段美妙的动画,不仅需要强大的软件工
  • 标题党,不丢人

  • 当人们形容一篇媒体作品为“标题党”时,常常带有贬义的情感色彩。所谓标题党,通常认为是用夸张的标题吸引人点击查看,内容却不甚相干或严重失实的信息。譬如热衷于套用短平快模
  • 浅谈JS函数式编程

  • 高效搬砖——拆分、组合、复用我们不妨以一个栗子开始:这是Scott Sauyet所著《Favoring Curry》中一个在项目实战里遇到的问题。var data = { result: "SUCCESS", inte