用 vue3 demo 讲解 pinia 的使用
一、搭建项目、安装以来npm create vite@latest my-vite-app --template vue-ts2). 安装 pinia 依赖
npm install pinia3).全局挂在 pinia
import { createApp } from "vue"; import App from "./App.vue"; import { createPinia } from "pinia"; const pinia = createPinia(); const app = createApp(App); app.use(pinia); app.mount("#app");二、搞正事,创建数据仓库 store
/src/store/piniaStore.ts import { defineStore } from 'pinia' export const useUsersStore = defineStore('pinia_id', { })三、组件中调用 pinia
<script setup lang="ts"> import { useUsersStore } from "../src/store/piniaStore"; const store = useUsersStore(); console.log(store); </script>方法很简单一个 useUsersStore 方法搞定,我们看一下打印内容:
$dispose: f $dispose()$id: "pinia_id" $onAction: f () $patch: f $patch(partialStateOrMutator) $reset: f Sreset() $subscribe: Ssubscribe(callback, options2 = ) const removeSubscription = addSuoscription(suhotUpdate: (newStore) => f...]也就这些哈,没啥玩楞。
//堆代码 duidaima.com export const useUsersStore = defineStore("pinia_id", { state: () => { return { age: 20, message:'我来存放公共数据哈!' sex: "男", }; }, });4.1 读取 state 数据
import { mapState } from 'vuex'// 将全局数据 因设为当前组件的计算属性
computed: { ...mapState(['count']) }pinia 如何访问呢?
<template> <p>描述:{{ message }}</p> <p>年龄:{{ age }}</p> <p>性别:{{ sex }}</p> </template> <script setup lang="ts"> import { ref } from "vue"; import { useUsersStore } from "../src/store/piniaStore"; const store = useUsersStore(); const message = ref<string>(store.message); const age = ref<number>(store.age); const sex = ref<string>(store.sex); </script>当然我们也可以用 es6 解构赋值来优化一下
const { message, age, sex } = store;4.2 多个组件使用 state
<template> <p>我是一个子元素</p> <p>描述:{{ message }}</p> <p>年龄:{{ age }}</p> <p>性别:{{ sex }}</p> </template> <script setup lang="ts"> import { ref } from "vue"; import { useUsersStore } from "../src/store/piniaStore"; const store = useUsersStore(); const { message, age, sex } = store; </script>4.3 修改 state 数据
② 通过这种方式虽然操作起来繁琐,但是可以集中监控所有数据的变化
<template> <img alt="Vue logo" src="./assets/logo.png" /> <p>年龄:{{ age }}</p> <button @click="changeAge">年龄不对</button> </template> <script setup lang="ts"> import child from './child.vue'; import { useUsersStore } from "../src/store/piniaStore"; const store = useUsersStore(); const { nage,} = store; const changeAge = () => { store.age = 26; console.log(store); }; </script>打印可也看出。store 中 age 数据发生了改变,再看看,呦呵,页面没响应。我们可能去监听 store 数据变化然后刷新页面,但有个更好的方法等着我们pinia 的storeToRefs 方法把我们的 state 变得具有响应
import { storeToRefs } from 'pinia'; const store = useUsersStore(); const { message, age, sex } = storeToRefs(store);4.4 初始化/重置 state 数据
<button @click="onResetData">重置store</button> const onResetData = () => { store.$reset(); };4.5 store 的$patch 方法批量修改数据
store.$patch({ message: "批量搞事情", age: 100, sex: "女", });部分修改: $patch 方法接收一个回调函数,用来修改部分数据
store.$patch((state) => { state.items.push({ message: 'shoes', quantity: 1 }) state.hasChanged = true })4.6 直接替换 state
export const useUsersStore = defineStore("pinia_id", { state: () => { return { age: 25, sex: "男", }; }, getters: { getAddAge: (state) => { return state.age + 100; }, }, });5.2 调用 getter
<template> <p>新年龄:{{ store.getAddAge }}</p> <button @click="patchStore">批量修改数据</button> </template> <script setup lang="ts"> import { useUsersStore } from "../src/store/piniaStore"; const store = useUsersStore(); // 批量修改数据 const patchStore = () => { store.$patch({ age: 100, sex: "女", }); }; </script>getter 中调用其它 getter,这里需要注意一下,不要箭头函数
export const useUsersStore = defineStore("users", { state: () => { return { age: 25, sex: "男", }; }, getters: { getAddAge: (state) => { return state.age + 100; }, getNameAndAge(): string { return this.name + this.getAddAge; // 调用其它getter }, }, });5.3 getter 传参
computed:{ getNewName(){ function (str){ return str+this.name } } }看一下 getter 的
<p>新年龄:{{ store.getAddAge(1100) }}</p> getters: { getAddAge: (state) => { return (num: number) => state.age + num; }, getNameAndAge(): string { return this.name + this.getAddAge; // 调用其它getter }, },六. actions 属性
export const useUsersStore = defineStore("pinia_id", { state: () => { return { message: "", age: 25, sex: "男", name:'王' }; }, getters: { getAddAge: (state) => { return (num: number) => state.age + num; }, getNameAndAge(): string { return this.name + this.getAddAge; // 调用其它getter }, }, actions: { saveName(name: string) { this.name = name; }, }, });6.2 使用 actions
const saveName = () => { store.saveName("我用来调用action内的方法"); };