Pinia的简单使用~

0.【起步】

0.1【起步__安装pinia】

  1. npm install pinia
  2. // or
  3. yarn add pinia

0.2【起步__项目引入】

  1. // main.ts
  2. import { createApp } from 'vue';
  3. import App from "./App.vue";
  4. import { createPinia } from 'pinia';
  5. const Pinia = createPinia();
  6. const app = createApp(App);
  7. app
  8. .use(Pinia)
  9. .mount("#app")

0.3【起步__创建store】

  1. // 路径:srec / store / userStore.ts
  2. import { defineStore } from 'pinia';
  3. // defineStore 第一个参数 name 是必须的,代表 此 store 唯一的 id
  4. // Pinia 使用此 id 来将 store 连接到 devtools
  5. export const useUserStore = defineStore('user', {
  6. // 配置属性
  7. })

1.【使用】

1.1【使用__添加 store 成员】

这里需要注意

  1. // 在配置属性中添加 state 属性, state 属性内就是基本数据
  2. import { defineStore } from 'pinia';
  3. export const useUserStore = defineStore('user', {
  4. // state 用来存放状态
  5. state: () => {
  6. return {
  7. userName '一位路过的假面骑士_',
  8. age: 18,
  9. sex: '男'
  10. }
  11. }
  12. })

1.2【使用__在页面使用 store 】

1.2.1【使用__在页面直接使用 store】
  1. // 路径: src / App.vue
  2. <script setup lang="ts">
  3. // 引入 store
  4. import { useUserStore } from "../src/store/user";
  5. const userStore = useUsersStore();
  6. console.log(store);
  7. </script>
  8. <template>
  9. <h1>{{ userStore.name }}</h1>
  10. <h2>{{ userStore.age }}</h2>
  11. <h3>{{ userStore.age }}</h3>
  12. </template>

1.2.2【使用__解构使用store】

与 vue3 解构使用变量一样,pinia 解构使用 store 也会失去响应式 ,因此需要使用 storeToRefs 将 store 包裹起来,它将为任何响应式属性创建 refs ,因为被包裹为 Ref 对象,因为在模板(template)中使用不需要 .value ,但是在 script 中直接使用还是需要 .value 取值

  1. // 路径: src / App.vue
  2. <script setup lang="ts">
  3. // 引入 store
  4. import { useUserStore } from "../src/store/user";
  5. import { storeToRefs } from 'pinia';
  6. const userStore = useUsersStore();
  7. const { name, age, sex } = storeToRefs(userStore);
  8. console.log(store);
  9. cosnole.log(name.value, "store中name属性的值") // 需要使用 .value 取值
  10. </script>
  11. <template>
  12. // 在模板中使用不需要 .value,因为会自动解包 ref
  13. <h1>{{ name }}</h1>
  14. <h2>{{ age }}</h2>
  15. <h3>{{ age }}</h3>
  16. </template>

2.【修改】

2.1【修改__单一state修改】

  1. // 路径: src / App.vue
  2. <script setup lang="ts">
  3. // 引入 store
  4. import { useUserStore } from "../src/store/user";
  5. import { storeToRefs } from 'pinia';
  6. const userStore = useUsersStore();
  7. const { name, age, sex } = storeToRefs(userStore);
  8. console.log(store);
  9. const updataName = () => {
  10. name.value = '雨一直下,气氛不算融洽'
  11. }
  12. </script>
  13. <template>
  14. <h1>{{ name }}</h1>
  15. <h2>{{ age }}</h2>
  16. <h3>{{ age }}</h3>
  17. <button @click="() => name = '张三'">修改name的值</button>
  18. // or
  19. <button @click="updataName">修改name的值</button>
  20. </template>

2.2【修改_批量更改state】

使用 $patch属性可批量、多个的修改 state

  1. // 路径: src / App.vue
  2. <script setup lang="ts">
  3. // 引入 store
  4. import { useUserStore } from "../src/store/user";
  5. import { storeToRefs } from 'pinia';
  6. const userStore = useUsersStore();
  7. const { name, age, sex } = storeToRefs(userStore);
  8. const multipleChange = () => {
  9. userStore.$patch({
  10. name: '坐地铁上班的假面骑士_',
  11. age: 20,
  12. sex: '男'
  13. })
  14. }
  15. </script>
  16. <template>
  17. <h1>{{ name }}</h1>
  18. <h2>{{ age }}</h2>
  19. <h3>{{ age }}</h3>
  20. <button @click="multipleChange">使用$patch批量修改state</button>
  21. </template>

2.3【修改__重置整个 store】

使用 $reset() 方法可以将整个 store重置为初始化时的状态

  1. // 路径: src / App.vue
  2. <script setup lang="ts">
  3. // 引入 store
  4. import { useUserStore } from "../src/store/user";
  5. import { storeToRefs } from 'pinia';
  6. const userStore = useUsersStore();
  7. const { name, age, sex } = storeToRefs(userStore);
  8. const resetStore = () => {
  9. // $reset 可以将 store 重置为 初始化状态
  10. userStore.$reset()
  11. }
  12. </script>
  13. <template>
  14. <h1>{{ name }}</h1>
  15. <h2>{{ age }}</h2>
  16. <h3>{{ age }}</h3>
  17. <button @click="resetStore">使用$patch批量修改state</button>
  18. </template>

3.【getters属性】

getters也是 配置属性中的另一个属性,getters 属性值是一个对象,有点类型于 Vue 的计算属性(computed),也是有缓存的

3.1【getters属性__定义getters】

定义的 getters方法默认会带有一个参数 state , 也就是 store 中的 state 对象,经过处理后,返回新的数据

  1. // 路径:srec / store / userStore.ts
  2. import { defineStore } from 'pinia';
  3. export const useUserStore = defineStore('user', {
  4. state:() => {
  5. return {
  6. name: '一位路过的假面骑士',
  7. sex: '男',
  8. age: 20
  9. }
  10. },
  11. getters: {
  12. // state 参数就是 上面 state 对象
  13. userAgeAdd:(state) => {
  14. return state.age + 100
  15. }
  16. }
  17. })
  18. // 使用
  19. // 路径: src / App.vue
  20. <script setup lang="ts">
  21. // 引入 store
  22. import { useUserStore } from "../src/store/user";
  23. import { storeToRefs } from 'pinia';
  24. const userStore = useUsersStore();
  25. const { name, age, sex } = storeToRefs(userStore);
  26. </script>
  27. <template>
  28. <h1>{{ name }}</h1>
  29. <h2>{{ age }}</h2>
  30. <h3>{{ age }}</h3>
  31. <h3>{{ userStore.userAgeAdd }}</h3>
  32. </template>

3.2【getters属性__在getters中使用另一个getter】

在另一个getters中调用另一个 getters可以使用到 this,此时的 this指向的便是 store实例

  1. // 路径:srec / store / userStore.ts
  2. import { defineStore } from 'pinia';
  3. export const useUserStore = defineStore('user', {
  4. state:() => {
  5. return {
  6. name: '一位路过的假面骑士',
  7. sex: '男',
  8. age: 20
  9. }
  10. },
  11. getters: {
  12. // state 参数就是 上面 state 对象
  13. userAgeAdd:(state) => {
  14. return state.age + 100
  15. },
  16. userUpdataAge(){
  17. // 这里调用了其他 getters 属性
  18. return this.age + this.userAgeAdd
  19. }
  20. }
  21. })

3.2【getters属性__给getters传参】

运用闭包的概念,返回一个新的函数,将 status 传入,便可以支持 getters传参

  1. // 路径:srec / store / userStore.ts
  2. import { defineStore } from 'pinia';
  3. export const useUserStore = defineStore('user', {
  4. state:() => {
  5. return {
  6. name: '一位路过的假面骑士',
  7. sex: '男',
  8. age: 20
  9. }
  10. },
  11. getters: {
  12. setUserAge:(state) =>{
  13. return (newAge) => state.age + newAge;
  14. }
  15. }
  16. })
  17. // 在组件中使用
  18. // 路径: src / App.vue
  19. <script setup lang="ts">
  20. // 引入 store
  21. import { useUserStore } from "../src/store/user";
  22. import { storeToRefs } from 'pinia';
  23. const userStore = useUsersStore();
  24. const { name, age, sex } = storeToRefs(userStore);
  25. </script>
  26. <template>
  27. <h1>{{ name }}</h1>
  28. <h2>{{ age }}</h2>
  29. <h3>{{ age }}</h3>
  30. <h3>更新后age:{{ userStore.setUserAge(5) }}</h3> // 25
  31. </template>