Pinia学习

144 阅读1分钟

官方站点:pinia.vuejs.org/

为什么学习pinia,因为pinia对vue3的支持远比vuex更让人舒服。

*vue2 使用vuex3 而vue3需要vuex4 并且支持并不友好

*pinia对于TS的支持比较友好

*pinia相对于vuex更简单,去掉了mutation

1、安装

yarn add pinia
# or with npm
npm install pinia

2、创建pinia

const pinia = createPinia()

3、挂载

const app = createApp(App)

app.use(pinia)

4、使用

import { defineStore } from "pinia";

// 1、定义容器

// 参数1:容器ID,必须唯一,将来Pinia会把所以的容器挂载到根容器

// 参数2: 选项对象

export const useMainStore = defineStore('main', {

/**

* 类似于组件的data,用于存储全局状态的

* 1、必须是函数:这样是为了在服务端渲染的时候避免交叉请求导致的数据状态污染

* 2、必须是箭头函数,这是为了更好的TS类型推导

*/

state: () => {

return {

count: 1000,

sum: 122

}

},

/**

* 类似于组件的computed,用于封装计算属性,有缓存的功能

*

*/

getters: {

// 函数接受一个可选参数:state状态对象

// 如果getters中使用了this则必须手动指定返回值的类型,否则类型推导不出来

count1(state): number {

console.log(state.count);

return state.count + 10

}

},

/**

* 类似于组件的methods,封装业务逻辑,修改state

*/

actions: {

// 注意:不能使用箭头函数定义 action

changeState( num : number) {

this.count += num;

}

}

})

const mainState = useMainStore();

// 直接解构会失去响应性

// const { count } = mainState;

// 使用 storeToRefs 解决上面的问题

const { count, sum} = storeToRefs(mainState);

const changeState = () => {

// mainState.count++;

// 如果需要修改多个数据,建议使用$patch批量更新

// mainState.$patch({

// count: mainState.count + 1,

// sum: mainState.sum + 2

// })

// mainState.$patch(state => {

// state.count++

// state.sum += 2

// })

}

代码内容是学习B站Pinia视频时敲的