vue3 pinia简单使用

参考:https://zhuanlan.zhihu.com/p/533233367

main.ts

import { createPinia } from "pinia";
app.use(createPinia())

 添加  src/store/user.ts

import { defineStore } from 'pinia'
// 第一个参数是应用程序中 store 的唯一 id
export const useUsersStore = defineStore('users', {
  // 其它配置项
})

使用

import { useUsersStore } from "../src/store/user";
const store = useUsersStore();
console.log(store);

store的具体数据存放在options的state属性内
添加(state接收的是一个箭头函数返回的值,它不能直接接收一个对象)

export const useUsersStore = defineStore("users", {
  state: () => {
    return {
      name: "小猪课堂",
      age: 25,
      sex: "",
    };
  },
});

使用

import { ref } from "vue";
import { useUsersStore } from "../src/store/user";
const store = useUsersStore();
const name = ref<string>(store.name);
const age = ref<number>(store.age);
const sex = ref<string>(store.sex);
或者
import { useUsersStore } from "../src/store/user";
const store = useUsersStore();
const { name, age, sex } = store;

更改state

store.name = "张三";

响应式更改state

import { useUsersStore } from "../src/store/user";
import { storeToRefs } from 'pinia';
const store = useUsersStore();
const { name, age, sex } = storeToRefs(store);
const changeName = () => {
  store.name = "小猪课堂";
};

重置state数据到最开始的值,初始化

store.$reset();

批量更改数据

全部替换
const patchStore = () => {
  store.$patch({
    name: "张三",
    age: 100,
    sex: "",
  });
};
替换部分
store.$patch((state) => {
  state.items.push({ name: 'shoes', quantity: 1 })
  state.hasChanged = true
})

直接替换这个state

store.$state = { counter: 666, name: '张三' }

options的getter属性
相当于vue的计算属性

添加
export const useUsersStore = defineStore("users", {
  state: () => {
    return {
      name: "小猪课堂",
      age: 25,
      sex: "",
    };
  },
  getters: {
    getAddAge: (state) => {
      return state.age + 100;
    },
  },
});
使用
<template>
  <p>新年龄:{{ store.getAddAge }}</p>
</template>
import { useUsersStore } from "../src/store/user";
const store = useUsersStore();

getter中调用其他getter

export const useUsersStore = defineStore("users", {
  state: () => {
    return {
      name: "小猪课堂",
      age: 25,
      sex: "",
    };
  },
  getters: {
    getAddAge: (state) => {
      return state.age + 100;
    },
    getNameAndAge(): string {
      return this.name + this.getAddAge; // 调用其它getter
    },
  },
});

getter传参

getAddAge: (state) => {
   return (num: number) => state.age + num;
},
使用
<p>新年龄:{{ store.getAddAge(1100) }}</p>

options的actions属性

处理复杂逻辑代码

添加
actions: {
  saveName(name: string) {
    this.name = name;
  },
},
使用
const saveName = () => {
  store.saveName("我是小猪");
};

 

posted @ 2023-03-09 10:50  jqynr  阅读(76)  评论(0)    收藏  举报