pinia状态管理工具
Pinia状态管理工具
搭建pinia环境
安装:
npm i pinia
编写main.ts
import { createApp } from "vue"; import App from "./App.vue"; //引入pinia import { createPinia } from "pinia"; const app = createApp(App); //创建pinia const pinia = createPinia(); //安装pinia app.use(pinia); app.mount("#app");
存储读取数据
存储
第一个文件位于:/src/store/count.ts,第二个文件位于:/src/store/loveTalk.ts
import { defineStore } from 'pinia' export const useCountStore = defineStore('count', { state() { //真正存储数据的地方 return { sum: 6 } } }); //################################ 另一个 ################################ import { defineStore } from 'pinia' export const useLoveTalkStore = defineStore('talk', { state() { //真正存储数据的地方 return { talkList: [ { id: "1", title: "今天你有点怪, 哪里怪? 怪好看!" }, { id: "2", title: "草莓、蓝莓、蔓越莓、今天想我没? " }, { id: "3", title: "心里给你留了一块地, 我的死心踏地" }, ] }; } });
读取
import { useCountStore } from '@/store/count'; const countStore = useCountStore(); //以下两种方式都可以拿到对应state的数据 // console.log(countStore.$state.sum); // console.log(countStore.sum); //################################ 另一个 ################################ import { useLoveTalkStore } from "@/store/loveTalk"; //数据 const talkList = useLoveTalkStore(); console.log(talkList.talkList);
修改数据
修改位置代码:
import { useCountStore } from '@/store/count'; const countStore = useCountStore(); //数据 let n = ref(1); //方法 function add() { //第一种修改方式 // countStore.sum += n.value; //第二种修改方式, 可以批量修改 // countStore.$patch({ // sum: 888, // school: '尚硅谷', // address: '北京' // }) //第三种修改方式 这种方式需要去count.ts文件中的actions中编写方法 countStore.increment(n.value); }
配置文件代码:
import { defineStore } from 'pinia' export const useCountStore = defineStore('count', { actions: { //放置的是一个一个的动作函数,用于响应组件中的"动作" increment(value:any) { //同样的逻辑可以提取到此处复用 // console.log('increment 被调用了', value); // console.log(this.sum); this.sum += value; } }, state() { //真正存储数据的地方 return { sum: 6, school: 'atguigu', address: '宏福科技园' } } });
storeToRefs 解构store并只关注数据
使用storeToRefs 只关注store中的数据,不会把所有都解构为响应式,如果使用toRefs就会把countStore中所有变为响应式代价太大。
const {sum, school, address} = storeToRefs(countStore)
getters的使用—类比计算属性
概念:当state
中的数据,需要经过处理后再使用时,可以使用getters
配置。类似计算属性
1、对应配置(与store同级):
getters: { // bigSum(state) { // return state.sum * 10; // }, bigSum:state => state.sum * 10, // upperSchool(state) { // console.log("!!!", this); // return state.school.toUpperCase(); // }, upperSchool():string { return this.school.toUpperCase(); } },
2、使用查看:
//###### 可以发现能够从countStore中直接解构出来使用 const {sum, school, address, bigSum, upperSchool} = storeToRefs(countStore)
$subscribe 订阅—有点监听的感觉
通过 store 的 $subscribe() 方法侦听 state 机器变化:
talkStore.$subscribe((mutate, state) => { console.log('talkStore里面保存的数据发生了变化', mutate, state); localStorage.setItem('talkList', JSON.stringify(state.talkList)); })
结合下面这种编写方式可以做一些初始化的东西
state() { //真正存储数据的地方 return { // talkList: [ // { id: "1", title: "今天你有点怪, 哪里怪? 怪好看!" }, // { id: "2", title: "草莓、蓝莓、蔓越莓、今天想我没? " }, // { id: "3", title: "心里给你留了一块地, 我的死心踏地" }, // ] talkList:JSON.parse(localStorage.getItem('talkList') as string) || [] }; }
store组合式写法
import { defineStore } from 'pinia' import axios from 'axios'; import { nanoid } from 'nanoid'; import { reactive } from "vue"; export const useLoveTalkStore = defineStore("talk", () => { //这个参数就类似setup函数 // talkList 就是 state const talkList = reactive( JSON.parse(localStorage.getItem('talkList') as string) || [] ) //getAtalk函数相当于 action async function getATalk() { // 发请求,下面这行的写法是:连续解构赋值+重命名 // let {data: { content: title }} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json'); let title = "获取到的一句话"; // 把请求回来的字符串,包装成一个对象 let obj = { id: nanoid(), title }; // 放到数组中 talkList.unshift(obj); } return {talkList, getATalk}; });
本文作者:如此而已~~~
本文链接:https://www.cnblogs.com/fragmentary/p/18626708
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库