vue3新一代状态管理库 Pinia

源码 2024-9-3 21:17:10 150 0 来自 中国
Pinia上风

Pinia是一个全新的Vue状态管理库,是Vuex的取代者,尤雨溪强势保举

1.Vue2 和 Vue3 都能支持
2.扬弃传统的 Mutation ,只有 state, getter 和 action ,简化状态管理库
3.不须要嵌套模块,符合 Vue3 的 Composition api,让代码扁平化
4.TypeScript支持
Pinia 根本使用

初始化项目: npm init vite@latest
安装Pinia: npm i pinia
挂载Pinia

import { createPinia } from 'pinia'const pinia = createPinia()createApp(App).use(pinia)创建Store

import { defineStore } from "pinia";export const useStore = defineStore('main', {  state: () => {    return {      msg: 'hello world hhhh',      Number: 1    }  },  getters: {},  actions: {}})使用Store

<template>  <div>HelloWorld</div>  <div>{{store.msg}}</div></template><script setup lang="ts">import { useStore } from "../index";const store = useStore()</script>解构Store

当store中的多个参数须要被使用到的时间,为了更轻便的使用这些变量,我们通常接纳布局的方式一次性获取全部的变量名
ES传统方式解构(能获取到值,但是不具有相应性)

<template>  <div>HelloWorld</div>  <div>{{ store.msg }}</div>  <div>{{ number }}</div>  <button @click="number++">+++</button></template><script setup lang="ts">import { useStore } from "../index";const store = useStore();const { number } = store;</script><style scoped></style>Pinia解构方法:storeToRefs

<template>  <div>HelloWorld</div>  <div>{{ store.msg }}</div>  <div>{{ number }}</div>  <button @click="number++">+++</button></template><script setup lang="ts">import { storeToRefs } from "pinia";import { useStore } from "../index";const store = useStore();// const { number } = store;const { number } = storeToRefs(store);</script><style scoped></style>多条数据修改

通过根本数据修改方式去修改多条数据也是可行的,但是在 pinia 官网中,已经明白体现$patch 的方式是颠末优化的,会加快修改速率,对性能有很大利益,以是在举行多条数据修改的时间,更保举使用$patch
$patch 方法可以担当两个范例的参数,函数 和 对象

$patch + 对象

$patch + 函数: 通过函数方式去使用的时间,函数担当一个 state 的参数,state 就是 store 堆栈中的 state

const change = () => {  store.$patch({    msg: 'hhhhhhhhhhhh',    number: store.number + 100  })}const change1 = () => {  store.$patch((state)=> {    state.msg = 'hhhhhhhhhhhh'    state.number = state.number + 100  })}Pinia中的Getters

Pinia 中的 getter 和 Vue 中的盘算属性险些一样,在获取 State值之前做一些逻辑处理惩罚getter 中的值有缓存特性,如果值没有改变,多次使用也只会调用一次添加 getter方法
getters: {    addNumber(state) {      return state.number * state.number1    }  },<div>{{store.addNumber}}</div><div>{{store.addNumber}}</div><div>{{store.addNumber}}</div> //多次调用也只会实验一次getter 中不但可以传递 state 直接改变数据状态,还可以使用 this 来改变数据,但要分析对应范例
getters: {    addNumber():any {      // return state.number * state.number1      return this.msg    }  },store之间的相互调用

在 Pinia 中,可以在一个 store 中 import 别的一个 store ,然后通过调用引入 store 方法的情势,获取引入 store 的状态
export const useStore = defineStore('use', {  state: () => {    return {      msg: 'hello world hhhhxxx',      number: 2,      number1: 3    }  },  getters: {    addNumber():any {      // return state.number * state.number1      return this.msg    }  },  actions: {  }})export const mainStore = defineStore('main', {  state: () => {    return {      msg: 'hello world hhhh',      number: 1    }  },  getters: {    addNumber() {      console.log(useStore().msg);    }  },  actions: {}})总结

总得来说,Pinia 就是 Vuex 的替换版,可以更好的兼容 Vue2,Vue3以及TypeScript。在Vuex的根本上去掉了 Mutation,只生存了 state, getter和action。Pinia拥有更轻便的语法, 扁平化的代码编排,符合Vue3 的 Composition api
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-2-1 05:57, Processed in 0.142853 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表