pinia

* 1.pinia去除 mutations,modules<模块分割>,只有 state,getters,actions;
* <vueX 修改state的值都需要commit 一个mutations里的修改函数来修改,来达到追踪数据>
* <vueX actions 处理异步时还需要dispatch 一个mutations里的修改函数来修改>
* 2. pinia 可以直接修改state或者$patch 或者调用actions中的方法 ,action支持同步和异步
* 3.没有modules模块,只有 store 的概念,store 之间可以自由使用,相互调用,更好的代码分割;
* 4.足够轻量,压缩后的体积只有1.6kb;vueX 44kb
* 5.支持持久化插件扩展,无需像vueX另外另外处理数据存储

安装


npm install pinia --save

在main.ts挂载


import { createApp } from 'vue'
import App from './App.vue'

import { createPinia} from 'pinia'
// 使用pinia持久化插件
import piniaPluginPersist from 'pinia-plugin-persist'
const pinia = createPinia()
pinia.use(piniaPluginPersist)
createApp(App).use(pinia)

createApp(App).mount('#app')

定义State

在 src/store 下面创建一个user.ts

import { defineStore } from 'pinia';
//引入另一个store.js 调用:carStore().方法名
import { carStore } from './car'

const mainStore = defineStore({
  id: 'user', // id必填,且需要唯一
  state: () => {
    return {
      name: 'xiaoming',
      age: 18,
    };
  },
  //类似于vue中的计算属性,自动监听对应state的变化,从而动态计算返回值
  //有缓存特性,如果值没有改变,多次使用也只会调用一次
  getters: {
    getAge(state) {
      console.log('getters被调用了');
      return state.name + '嘻嘻嘻'
    },
  },
  actions: {
    //actions中支持同步和异步方法
    changeState() {
      this.age++;
    },
    opt(){
        return new Promise<string>((resolve, reject) => {
            setTimeout(()=>{
                resolve('Promise')
            },3000)
        })
    },
    async fun(){
        //action 间的方法相互调用,直接用 this 访问即可。
        let data =await this.opt();
        this.name = data;
        console.log(carStore().getCarName('传值了'))//调用了carStore里的事件传值了
    }
  },
   //数据缓存 sessionStorage 
   //页面刷新后存储的state不会消失,state中数据和存储的数据同步变化
   persist: {
    enabled: true,
    strategies: [
        {
          storage: localStorage, //改为存储到localStorage
          paths: ['age'] //只持久化 age
        }
    ]
  }
});
export { mainStore };
定义car.ts

import { defineStore } from 'pinia';
const carStore = defineStore({
  id: 'car',
  state: () => {
    return {
      name: 'BBA',
    };
  },
  actions: {
    getCarName(data:string){
        return '调用了carStore里的事件'+data
    }
  },
});
export {
    carStore
}
使用

<template>
  {{name}}
  {{age}}
  <div><button @click="add">简单修改数据</button></div>
  <div><button @click="addMore">多条数据修改</button></div>
  <div><button @click="action">action修改同步</button></div>
  <div><button @click="store.fun">action修改异步</button></div>
  {{store.getAge}}
</template>

<script lang="ts" setup>
import {mainStore } from './store/index'
import { storeToRefs } from 'pinia';  //当state中有多个数据时,可以使用Pinia解构方法:storeToRefs 
const store = mainStore()
const {name,age} = storeToRefs(store) //解构
//修改state中的数据
//1.简单数据修改-------- 操作store.属性名 来修改
//2.多条数据修改------ $patch的方式是优化过的,会加快修改速度,对性能有很大好处,适合操作多条数据
//$patch + 对象 或者 $patch + 函数(state) //state 就是 store 仓库中的 state
//3.actions修改  Store.actions中添加方法 然后调用 store.方法名
const add = ()=>{
  store.age+=1
}
const addMore =()=>{
  // store.$patch({
  //   name:store.name+'X',
  //   age:store.age+2
  // })
  store.$patch((state:any)=>{
    state.name=state.name+'X';
    state.age =state.age+2
  })
}
const action=()=>{
  store.changeState();
  //重置state的数据
  store.$reset()
  
}
</script>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值