// 使用 vite 安装项目,这里 init 不能改为 i,i 是 install 的简写
npm init vite
// 项目名称
? Project name: » vite-project
// 选择要使用的框架,我这里选的是 Vue
? Select a framework: » - Use arrow-keys. Return to submit.
vanilla
> vue
react
preact
lit
svelte
// 使用 js 还是 ts
? Select a variant: » - Use arrow-keys. Return to submit.
> vue
vue-ts
npm init vite-app ProjectName
这两种安装方式都没有安装依赖包,需要进入文件 npm i 安装依赖包
npm i pinia
store/index.js 文件import { defineStore } from "pinia"
// defineStore(当前 store 的 Id, {配置项})
export const countStore = defineStore("count", {
// 状态
state: () => {
return {
count: 1
}
},
// 计算属性
getters: {
// 这里的计算属性使用时,为一个属性而不是方法
increaseNum(store) {
return store.count * 10
}
},
// 方法
actions: {
addCount(value) {
this.count += value
}
}
})
main.js 中引入// 这是 Vue3 的引入方式,Vue2 不太一样
import { createApp } from "vue";
import App from "./App.vue";
import { createPinia } from "pinia";
const app = createApp(App);
app.use(createPinia());
app.mount("#app");
这样就可以在任意位置引入 store 了
<script setup>
import { countStore } from "../store/index.js";
// 可以直接通过 store. 去获取 state、getters、actions 中的属性和方法了
const store = countStore();
// 直接获取
store.count // 1
// 计算属性获取
store.increaseNum // 10
// 修改状态1
store.count += 1
// 修改状态2
store.addCount(1)
// 修改状态3,这种方式和 React 中的 setState 很像
store.$patch({
count : store.count + 1
})
// 修改状态4
store.$patch((state) => {
state.count += 1
})
// 替换状态(不是覆盖状态),需要新的状态去替换旧的,如果 key 值不相同就是添加新状态
store.$state = {count: 2}
// 重置状态
store.$reset()
// 这个时候在使用其他组件引入 countStore 时,count 也是为最新的
script>
<script setup>
import { countStore } from "../store/index.js";
const store = countStore();
// store 中的值,每修改一次就会触发
store.$subscribe(({ events, storeId, type }, state) => {
// 里面包含了一些信息
events
// 这个 store 的 Id,这里是 count
storeId
/*
修改值的方式:
'direct':直接修改、使用 action 中的方式修改
'patch object':使用 $patch({}) 修改
'patch function':使用 $patch((state)=>{}) 修改、使用 $state 替换、$reset()重置
*/
type
});
script>
<script setup>
import { countStore } from "../store/index.js";
const store = countStore();
// action 中的函数每次调用,都会触发一次
store.$onAction(({ args, name, store, after, onError }) => {
// 调用 actions 中函数的传参列表
args
// 函数名称
name
// store 对象
store
// 当函数正常执行完成后执行
// result 接收函数返回成功状态的 Promise
after((result) => {
console.log(result);
});
// 当函数中存在失败状态的 Promise,或函数抛出异常时执行
onError((err) => {
console.log(err);
});
});
script>