pinia简单使用

1.pinia.ts 定义

import { defineStore } from "pinia";
import { Names } from "./store-name";
import { ref, computed } from "vue";
import Dayjs from "dayjs";
// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`)
//store-name.ts 
//export enum Names {
//   TEST = "test",
//   USER = "user"
// }
// 第一个参数是你的应用中 Store 的唯一 ID。
// defineStore() 的第二个参数可接受两类值:Setup 函数或 Option 对象。

// options API
export const useTestStore = defineStore(Names.TEST, {
  state: () => ({
    name: "多多",
    count: 1,
    time: [Dayjs(new Date()).format("YYYY-MM-DD")]
  }),
  getters: {
    // computed 修饰的一些值
    double: (state) => state.count * 2
  },
  actions: {
    // methods 同步异步 提交state
    increment() {
      this.count++;
    },
    changeTime(value: string[]) {
      this.time = value;
    }
  }
});


interface User {
  name: string;
  age: number;
}
// 异步获取时
const asyncData = () => {
  return new Promise<User>((resolve, reject) => {
    setTimeout(() => {
      resolve({ name: "异步", age: 2000 });
    }, 2000);
  });
};


// setup
export const useUserStore = defineStore(Names.USER, () => {
  // setup中:ref等于state  computed等于getters methods等于actions
  const name = ref("图图");
  const age = ref(18);
  const userMsg = computed(() => {
    return `我叫${name.value},我${age.value}岁了`;
  });
  const setUser = (user: User) => {
    !!user.name && (name.value = user.name);
    !!user.age && (age.value = user.age);
  };
  // 异步
  const asyncSetUser = async () => {
    const res = await asyncData();
    setUser(res);
  };
  return { name, age, userMsg, setUser, asyncSetUser };
});

2.使用

<div>USER:{{ name }} --- {{ age }} --- {{ userMsg }}</div>
  <div>
    TEST:
    <el-button type="primary" :icon="Edit" circle @click="test.increment" />
    count:{{ test.time }}{{ test.count }}double:{{ test.double }}
  </div>
    
import { useUserStore, useTestStore } from "@/store/pinia";
import { storeToRefs } from "pinia";
const user = useUserStore();
const test = useTestStore();
//pinia中,state相当于reactive不能直接解构,会失去响应性,pinia提供了 storeToRefs() 使其解构响应性不丢失
const { name, age,userMsg } = storeToRefs(user);

Pinia 是 Vue.js 的状态管理库,它用于管理组件间共享的状态。其设计灵感来自于 Vuex 4,但更加简洁和模块化。Pinia 可以被看作是 Vuex 的替代方案,但其核心思想是提供一个简单、轻量、但同时具备Vuex核心特性的状态管理解决方案。 使用 Pinia 主要包含以下几个步骤: 1. 安装 Pinia: 你可以通过 npm 或 yarn 来安装 Pinia。 ```bash npm install pinia # 或者 yarn add pinia ``` 2. 创建一个 Pinia store: 在你的 Vue 应用中,你可以创建一个或多个 store 来管理状态。每个 store 都是一个带有状态(state)、getter、actions 的对象。 ```javascript import { defineStore } from 'pinia'; export const useCounterStore = defineStore('counter', { state: () => ({ count: 0, }), actions: { increment() { this.count++; }, }, getters: { doubleCount: (state) => state.count * 2, }, }); ``` 3. 在组件中使用 store: 在 Vue 组件中,你可以通过 `useStore` 方法来访问和操作 store 中的状态和方法。 ```javascript <template> <div> <p>Count: {{ store.count }}</p> <button @click="store.increment">Increment</button> </div> </template> <script> import { useCounterStore } from '@/stores/counter'; export default { setup() { const store = useCounterStore(); return { store }; }, }; </script> ``` 4. 启用 Pinia: 最后,需要将 Pinia 添加到 Vue 应用中。 ```javascript import { createApp } from 'vue'; import { createPinia } from 'pinia'; import App from './App.vue'; import { useCounterStore } from '@/stores/counter'; const app = createApp(App); const pinia = createPinia(); app.use(pinia); app.mount('#app'); ``` 通过以上步骤,你就可以在 Vue 应用中使用 Pinia 来管理状态了。Pinia 提供了响应式的状态管理,使得状态的跟踪和调试更加方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值