【pinia】使用记录

pinia是什么?

全局状态管理器

pinia相较于vuex有哪些区别

1、体积 ,pinia只有1KB左右,相较于vuex体积小了不是一点点。
2、状态管理pinia没有mutation,他只有state,getters,action【同步、异步】使用他来修改state数据,而vuex的状态管理有state,mutation,getters,action
3、更好的支持ts

所以pinia很轻量,适合轻量级的应用。轻量级的小项目用pinia是完全没问题的。

使用方式

引入

npm install pinia@next

然后设置为全局对象,在main.js里面引用

import { createPinia } from "pinia" // 全局引入pinia管理数据状态
app.use(createPinia())

创建一个store管理状态

// store.js
import { defineStore } from "pinia"

// defineStore 调用后返回一个函数,调用该函数获得 Store 实体
export const myStores = defineStore({
  // id: 必须的,在所有 Store 中唯一
  id: "myStore",
  // state: 状态存储定义的地方,返回的是一个对象函数
  state: () => ({
    numOne: 1,
  }),
  getters: {}, //相当于computed,与vuex的getters一样的
  //action里面可以写同步也可以写异步,相较于vuex少了mutation,将mutation和action都合并成了action,所以修改state的方法都统一写在action里面了
  actions: {
    setnum(num) {
      this.numOne = num;
    },
  },
});

// 在vue3中使用
<template>
    <div>
        {{nums}}
        <button @click="clickHandle">按钮</button>
    </div>
</template>
<script>
//引入myStores 
import { myStores } from "@/store/store.js"
export default {
    setup(){
        let store = myStores ();
        //如果直接取state的值必须使用computed才能实现数据的响应式 如果直接取 store.state.a 则不会监听到数据的变化,或者使用getter,就可以不使用computed (这边和vuex是一样的)
        let nums= computed(()=>store.numOne)
        const clickHandle = () => {
            store.setnum("100")
        }
        return{nums,clickHandle}
    }
}
<script>

vue3语法糖写法

就改装上面的


// store.js
import { defineStore } from "pinia"
import { ref } from "vue"
// defineStore 调用后返回一个函数,调用该函数获得 Store 实体
export const myStores = defineStore("myStore",() => {
	const numOne = ref(1)
	function setnum(num) {
      numOne.value = num;
    }
    return { numOne , setnum }
});

// 在vue3中使用
<template>
    <div>
        {{nums}}
        <button @click="clickHandle">按钮</button>
    </div>
</template>
<script setup>
//引入myStores 
import { computed } from "vue"
import { myStores } from "@/store/store.js"
let store = myStores ();
 //如果直接取state的值必须使用computed才能实现数据的响应式 如果直接取 store.state.a 则不会监听到数据的变化,或者使用getter,就可以不使用computed (这边和vuex是一样的)
let nums= computed(()=>store.numOne)
const clickHandle = () => {
     store.setnum("100")
}
<script>

$patch修改数据

除了上述修改数据的方法 还可以直接修改,或者 $patch可以修改state数据

直接修改就是直接,这种方式太那啥了 不建议

store.numOne = "dsjak"

$patch修改

	let store = myStores ();
    // 第二种修改方式:使用$patch改变数据 $patch 可以同时修改多个值
    function changeDataByPatch() {
      /*
      $patch也有两种的调用方式
      * */
      // 第一种 $patch方法
      store.$patch({
         numOne: '6475d7a675da'
      })
 
      // 第二种 $patch方法
      store.$patch((state) => {
        state.numOne= '6475d7a675da'
      })
     }

如果我们要修改的数据是数组的话,使用 p a t c h 的 第 二 种 方 式 比 较 赞 , 因 为 第 一 种 方 式 需 要 将 数 据 的 所 有 数 据 传 入 进 去 , 才 能 保 证 数 组 中 的 其 他 数 据 不 会 变 化 , 如 果 使 用 patch的第二种方式比较赞,因为第一种方式需要将数据的所有数据传入进去,才能保证数组中的其他数据不会变化,如果使用 patch使patch的第二修改方式就可以直接指定修改数组中的某一个数据。举个栗子

	  let store = myStores ();
	  // numOneList的原始数据:[1,2,3,4],我们将4修改成"cindy"
      // 第一种 $patch方法
      store.$patch({
         numOneList: [1,2,3,"cindy"]
      })
 
      // 第二种 $patch方法,对吧第二种看着就简单一点,哈哈哈哈
      store.$patch((state) => {
        state.numOneList[3] = "cindy"
      })

storeToRefs解构赋值,没有通过解构赋值的数据是不具有响应性的

我们可以通过storeToRefs 来进行解构赋值

import { storeToRefs } from "pinia"
import appStore from "@/store"
//aDevList 为我们定义的数据
const { aDevList } = storeToRefs(appStore.deviceStore)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值