pinia与vuex的区别

Vuex和Pinia的一些区别

  • pinia支持组合式api
  • pinia更好的支持TS
  • pinia没有了mutation,pinia的action可直接修改state。
  • pinia无需再使用dispatch分发action,也不需要使用commit提交mutation,可直接调用action。
  • vuex只能创建一个store实例, pinia可以创建任意个。
  • pinia没有了modules,可直接创建一个新的store作为module。vuex是一个对象嵌套的方式存储状态, 而pinia是

Vuex

  • vuex 3.x 通过Vuex.Store()创建一个store;
  • Vuex.Store()接受一个对象作为参数;
  • 参数对象上的key值只能是stategettersmutationsactionsmodules
  • state上定义的是共享的状态/变量
  • getters上定义的是根据state派生出的状态
  • mutation上定义的是可以同步修改状态的方法
  • actions上定义的是可以异步/同步执行mutaions上的方法的方法
  • modules上定义的是模块,可以根据业务将状态分模块存放,一个模块就是一个对象,该对象上的key值也是stategettersmutationsactionsmodulesmodules上可以继续嵌套modules

Vuex实践

  • 定义store
js 复制代码
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

interface Object {
  [key: string]: any
}

const womanModule = {
  state: {
    pregnant: false //是否怀孕
  },
  mutations: {
    setPregnant(state : Object, value: boolean) {
        state.pregnant = value
    }
  },
  actions: {
    setPregnant(context : Object, value : boolean) {
      context.commit('setPregnant', value)
    }
  }
}
const personModule = {
  state: {
    id: 0,
    name: '',
    age: 0
  },
  mutations: {
    setId(state: Object, id: number) {
      state.id = id
    },
    setName(state: Object, name: string) {
      state.name = name
    },
    setAge(state: Object, age: number) {
      state.age = age
    }
  },
  actions: {
    setId(context: Object, id: number) {
      context.commit('setId', id)
    },
    setName(context: Object, name: string) {
      context.commit('setName', name)
    },
    setAge(context: Object, age: number) {
      context.commit('setAge', age)
    }
  },
  modules: {
    womanModule
  }
}

export default new Vuex.Store({
  state: {
    
  },
  getters: {},
  mutations: {

  },
  actions: {

  },
  modules: {
    personModule
  }
})

使用store

js 复制代码
<template>
    <div>
        <div>{{  personModule.id  }}</div>
        <div>{{  personModule.name  }}</div>
        <div>{{  personModule.age  }}</div>
        <div>{{ personModule?.womanModule?.pregnant }}</div>
    </div>
</template>

<script setup lang="ts">
import store from '../store/index'
const state  : {[key: string]: any} = store.state;
const personModule : {[key: string]: any}= state.personModule;
store.dispatch('setId', 1)
store.dispatch('setName', 'role')
store.dispatch('setAge', personModule.age || 18)
store.dispatch('setPregnant', true)
</script>

Pinia实践

定义store

js 复制代码
import { ref, computed } from 'vue'
import type {Ref} from 'vue'
import { defineStore } from 'pinia'

// 选项式定义一个store
export  const useTestPerson = defineStore('person', {
  state: () => ({
    id: 0,
    name: '',
    age: 0
  }),
  getters: {
    adult() : boolean {
      return this.age >= 18
    }
  },
  actions: {
    setId(value: number) {
      this.id = value
    },
    setName(value: string) {
      this.name = value
    },
    setAge(value: number) {
      this.age = value
    }
  }
})

// 组合式定义一个store
export const useWoman = defineStore('woman', () => {
  let pregnant: Ref<boolean> = ref(false)

  const changePregnant = () => {
    pregnant.value = !pregnant.value
  }
  return {
    pregnant,
    changePregnant
  }
})

使用store

js 复制代码
<template>
    <div>
        <div>编号:{{ person.id }}</div>
        <div>名称:{{ person.name }}</div>
        <div>年龄:{{ person.age }}<el-button @click="changeAge">change age</el-button></div>
        <div>是否成年:{{ person.adult }}</div>
    </div>

    <div>
        <div>是否生育: {{ woman.pregnant }}<el-button @click="changePregnant">change</el-button> </div>
    </div>
</template>

script setup lang="ts">
    import { ref, computed, watch, onMounted } from 'vue'
    import type {Ref} from 'vue'
    import { ElButton, ElInput } from 'element-plus'
    import { useTestPerson, useWoman } from '../stores/test'

    // 
    const person = useTestPerson()
    person.setId(1)
    person.setName('lily')
    person.setAge(18)

    const changeAge = () => {
        person.setAge(11)
    }

    // 
    const woman = useWoman();
    const changePregnant = () => {
        woman.changePregnant()
    }
    
</script>
相关推荐
问道飞鱼4 天前
【前端知识】Vue组件Vuex详细介绍
前端·vue.js·flutter·vuex
Little_Code10 天前
uniapp 如何使用vuex store (亲测)
uni-app·vuex·store
getaxiosluo1 个月前
实现vuex源码,手写
vue.js·源码·vuex·1024程序员节
kidding7231 个月前
前端容易错的题3
前端·vuex·watch·computed·.prevent·.capture·.once
天涯学馆2 个月前
Svelte Store与Vuex:轻量级状态管理对比
前端·vue·vuex·svelte
天使day2 个月前
Vuex全局状态管理1
vue·vuex
儒雅的烤地瓜3 个月前
Vue | 简单说说 Vuex 实现响应式的原理
javascript·vue.js·vuex·响应式系统·vue响应式原理
Java_慈祥3 个月前
Vuex 深入浅出超详细
前端·vue.js·vuex
坚持不懈的大白4 个月前
前端:Vue学习 - 购物车项目
axios·vue2·less·vuex·json-server
特立独行的猫a4 个月前
Pinia:Vue 2 和 Vue 3 中更好用的状态管理框架
前端·javascript·vue.js·pinia·vuex