直接对比Vuex和Pinia在项目中的用法,5分钟就会用

前言:

我相信看这编文章的大部分都是会vuex和pinia其中一个状态管理的,想对比学习另一个。所以我将会从安装->使用->修改状态,每一步进行横向对比学习,这样会更加通俗易懂。如果有某一天忘记了某个地方的写法回头查看一下也起到了笔记的作用。

一、pinia详细用法

(1)安装pinia
yarn add pinia
    或者
npm npm install pinia
(2)创建状态仓库

先得知道 pinia 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字 defineStore()
的第二个参数可接受两类值:Setup 函数或 Option 对象。

pinia传入Option对象的核心概念包括:

  • state: 用来定义一些变量
  • getters: 类似于计算属性
  • actions:里面是一些方法,在里面可以请求接口操作
import {defineStore} from 'pinia'

const useUser = defineStore("user",{
    state:() => ({  // 用来定义一些变量
        mycount: 1,
    }),
    
    getters: { // 类似于计算属性
        double: (state) => state.mycount * 2,
    },

    actions: {  // 里面是一些方法,在里面可以请求接口操作
        increment() { 
            this.mycount++ 
        },
        async registerUser(login, password) {  // 异步操作
            await api.post({ login, password })
        }
    }
})


export default useUser
(3)项目在main.js文件中引入并注册使用

在main.js中引用,挂载为全局对象

import { createPinia } from "pinia";

const pinia = createPinia()
app.use(pinia)
(4)获取pinia的变量

引入后直接使用即可,对比vuex会方便很多

<template>
  <div>
      看看state中的值:{{useUser.mycount}}
      使用getters里面的计算属性: {{ useUser.double }}
  </div>
</template>

<script setup>
// 需要引入刚刚创建的store
import useUser from '@/stores/index'

// 得调用一下
const useUser = useUser()

</script>

注意: 不能对 useUser 进行解构否则会失去响应式, 但官方提供了storeToRefs这个方法用来解构,如下所示:

// 用官方提供storeToRefs解构
const {mycount} = storeToRefs(useUser)
(5)更新变量

方法一: pinia可以直接修改state里面的变量,这是和vuex区别最大的地方,也是使的pinia使用起来更加灵活方便

<template>
  <div>
      看看pinia的值:{{useUser.mycount}}
      <button @click="update">修改pinia数据</button>
  </div>
</template>

<script setup>
import useUser from '@/stores/index'

const useUser = useUser()

// 直接就能修改
function update(){ 
    useUser.mycount++
}

缺点: 如果一次修改很多个不方便

方法二: $patch函数修改

function update(){
    // 一次性修改多个状态
    useUser.$patch({
        name:"天天鸭",
        age:20
    })
}

二、vuex详细用法

(1)安装vuex
npm install vuex@next --save

或者
yarn add vuex@next --save
(2)创建状态仓库

vuex的核心概念包括:

  • state: 用来定义一些变量
  • getters: 类似于计算属性
  • mutations: 是用来触发事件(必须是同步函数),通过这个事件修改state里面的变量
  • Actions:用于提交mutations,可以包含任意异步操作,在里面可以请求接口操作
  • Modules:将store分割成模块,每个模块拥有自己的state、getters、mutations和actions。

创建一个store文件夹,里面创建index.js文件

import Vue from "vue"
import Vuex from "vuex"
 
Vue.use(Vuex);
 
export default new Vuex.Store({
    state:{  // 用来定义一些变量
        userName: "",
        count: 1,
    },
    
    getters: {  // 类似于计算属性
        doneTodos (state) {
          return state.count*2
        }
      },

    mutations:{ // 是用来触发事件, 修改userName
        saveName(state,userName){
            state.userName = userName;
        },
    },
    
    actions: {  // 用于提交mutations,可以包含任意异步操作,, 在里面可以请求接口操作
        increment (context) {
          context.commit('saveName')
        }
    }
})
(3)项目在main.js文件中引入并注册使用
 import store from './store/index';

  new Vue({
      el: '#app',
      router,
      store,
      render: h => h(App)
  });
(4)获取vuex的变量

例如在项目某个地方获取用户名称

方法一: 语法是 this.$store.state.变量名

 this.$store.state.userName
  
  //获取里面getters的内容
 this.$store.getters.doneTodos

方法二:可以用计算属性解构出来,能直接使用this.userName

import { mapGetters } from 'vuex'

 computed:{
   ...mapGetters(['userName']),
   doneTodosCount () {   //  //获取里面getters的内容
     return this.$store.getters.doneTodos
   }
 },
(5)更新变量

即我想修改vuex中的一个变量,

方法一:语法this.$store.commit(触发的方法, 修改成什么内容)

methods:{
    myclick(){
        this.$store.commit('saveName', this.newName)
    }
}

方法二:解构出来用

 methods: {
      ...mapActions(['saveName'])
  }

  this.saveName()

三、小结

如果你认真看完全部内容,你会发现pinia比vuex更加简洁更加灵活,甚至能直接修改state里面的变量,但其实并不是简单就绝对更好,我个人认为总的来说,认识vuex适合于大型项目或需要复杂状态管理的场景,而pinia则更适合于中小型项目或对状态管理需求不是很复杂的情况。选择使用哪个取决于项目的具体需求和开发团队的偏好。

纯用法上最主要差异: (1)pinia能直接使用state,并且能直接修改;vuex要通过mutation去修改
(2)pinia处理方法只有action,不区分同步异步;vuex在mutation处理同步,在action处理异步
(3)pinia没有modules嵌套结构,是一个平面的结构,可创建不同的 Store

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vuex和Pinia都是Vue.js的状态管理库,用于在Vue.js应用程序管理和共享状态。它们都提供了一种结构化的方式来管理应用程序的状态,并且能够在组件之间方便地共享数据。[1] 然而,Vuex和Pinia在设计和使用上有一些区别。VuexVue.js官方推荐的状态管理库,它使用了基于对象的全局状态树的概念,通过定义和调用mutations、actions和getters来修改和获取状态。而Pinia是由Vue.js社区维护的新一代状态管理库,它借鉴了Vuex的设计思想,并使用了Vue 3 Composition API来定义状态和操作。Pinia提供了更简洁、类型安全的API,并且与Vue 3生态系统的其他库和工具更好地集成。 虽然VuexVue.js的官方推荐库,并且在大量项目得到了广泛应用,但Pinia作为一个新兴的状态管理库也受到了一定的关注。它提供了更好的类型安全性和更简洁的API,尤其是在使用Vue 3 Composition API时,能够让开发者更好地利用Vue.js的新特性。 总结来说,VuexVue.js官方推荐的状态管理库,而Pinia是一个新一代的状态管理库,它们都可以在Vue.js应用程序管理和共享状态,但在使用方式和API设计上有一些区别。具体选择使用哪个库,可以根据项目的需求、开发者的习惯和技术栈来进行权衡和选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [简介vuex和pinia](https://blog.csdn.net/m0_71966801/article/details/131603107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [在vue使用pinia,并且保持数据持久化](https://download.csdn.net/download/shaoyahu/87691975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值