4、vuex

Vuex是一个专为Vue.js应用程序开发的状态管理模式,它集中管理组件的共享状态,并提供getter、actions、mutations来操作数据。文章详细介绍了Vuex的工作原理,包括如何通过dispatch触发actions,进而commit修改mutations以更新state,以及如何搭建Vuex环境。此外,还讨论了getters的使用、四个map方法的映射功能,以及Vuex的模块化和namespace命名空间的应用,以提升代码可维护性和数据管理的清晰度。
摘要由CSDN通过智能技术生成
文章目录

1、简介

2、工作原理

3、搭建vuex环境

4、基本使用(getters配置项、mapState、mapGetters、mapActions、mapMutations)

5、vuex模块化+namespace命名空间

一、简介

1、含义

专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方 式,且适用于任意组件间通信。

Github 地址: https://github.com/vuejs/vuex

2、使用的场景

  • 多个组件依赖于同一状态
  • 来自不同组件的行为需要变更同一状态

二、工作原理

Vuex应用的核心就是store,包括:state(数据)、getter(数据加工)、actions(事件)、mutations(执行)

单向数据流如图所示:

在这里插入图片描述

页面点击加2

=>dispatch(‘jia’, 2) ,去分发一个action

=> Actions的对象 { …, jia: function(context, data) { // 此处逻辑处理,并调用context.commit函数,自身会返回一个promise,支持异步操作 }}

=> commit(‘jia’, 2) ,去调用mutations

=> Mutations的对象{ …, jia: function(state, data) { // 此处的逻辑可以改变State的值,只能是同步操作,不支持异步操作 }}

=> State的对象{ …, sum: 0 }

=> 重新渲染页面render

困惑:为什么还需要dispatch和Actions对象这一层,而不直接commit和Mutations对象,这个是不是有点多余???

dispatch是异步操作、commit是同步操作

commit不能是异步操作,不然数据会变得难以追踪,异步存在太多不确定因素,不知道数据何时返回?成功与否?

Mutations修改数据,不支持异步,只是一个单纯的函数

三、搭建vuex环境

  • npm i vuex@3

​ vue2中,要用vuex的3版本

​ vue3中,要用vuex的4版本

  • Vue.use(Vuex)

  • store

  • vc ===> store

1、创建文件:src/store/index.js

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备state对象——保存具体的数据
const state = {}

//创建并暴露store
export default new Vuex.Store({
   actions,
   mutations,
   state
})

2、在main.js中创建vm时传入store配置项

......
//引入store
import store from './store'
......

//创建vm
new Vue({
   el:'#app',
   render: h => h(App),
   store
})

四、基本使用(getters配置项、mapState、mapGetters、mapActions、mapMutations)

1、基本使用

  1. 初始化数据、配置actions、配置mutations,操作文件store.js

    //引入Vue核心库
    import Vue from 'vue'
    //引入Vuex
    import Vuex from 'vuex'
    //引用Vuex
    Vue.use(Vuex)
    
    const actions = {
        //响应组件中加的动作
       jia(context,value){
          // console.log('actions中的jia被调用了',miniStore,value)
          context.commit('JIA',value)
       },
    }
    
    const mutations = {
        //执行加
       JIA(state,value){
          // console.log('mutations中的JIA被调用了',state,value)
          state.sum += value
       }
    }
    
    //初始化数据
    const state = {
       sum:0
    }
    
    //创建并暴露store
    export default new Vuex.Store({
       actions,
       mutations,
       state,
    })
    
  2. 组件中读取vuex中的数据:$store.state.sum

  3. 组件中修改vuex中的数据:$store.dispatch('action中的方法名',数据)$store.commit('mutations中的方法名',数据)

    备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit

2、getters配置项

  1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工

  2. store.js中追加getters配置

    ......
    
    const getters = {
       bigSum(state){
          return state.sum * 10
       }
    }
    
    //创建并暴露store
    export default new Vuex.Store({
       ......
       getters
    })
    
  3. 组件中读取数据:$store.getters.bigSum

3、4个map方法

(mapState、mapGetters、mapActions、mapMutations)

  1. mapState方法:用于帮助我们映射state中的数据为计算属性

    import { mapState } from 'vuex'
    ...
    computed: {
        /**
        sum() {
            return this.$store.state.sum
        },
        school() {
            return this.$store.state.school
        },
        subject() {
            return this.$store.state.subject
        },
        **/
        //借助mapState生成计算属性:sum、school、subject(对象写法)
         ...mapState({sum:'sum',school:'school',subject:'subject'}),
             
        //借助mapState生成计算属性:sum、school、subject(数组写法)
        ...mapState(['sum','school','subject']),
    },
    
  2. mapGetters方法:用于帮助我们映射getters中的数据为计算属性

    import { mapGetters } from 'vuex'
    ...
    computed: {
        /**
        bigSum() {
            return this.$store.getters.bigSum
        },
        **/
        //借助mapGetters生成计算属性:bigSum(对象写法)
        ...mapGetters({bigSum:'bigSum'}),
    
        //借助mapGetters生成计算属性:bigSum(数组写法)
        ...mapGetters(['bigSum'])
    },
    
  3. mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数

    import { mapActions } from 'vuex'
    ...
    methods:{
        /*
        incrementOdd(value) {
            return this.$store.dispatch('jiaOdd', value)
        },
        incrementWait(value) {
            return this.$store.dispatch('jiaWait', value)
        }
        */
        //靠mapActions生成:incrementOdd、incrementWait(对象形式)
        ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
    
        //靠mapActions生成:incrementOdd、incrementWait(数组形式)
        ...mapActions(['jiaOdd','jiaWait'])
    }
    
  4. mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数

    import { mapMutations } from 'vuex'
    ...
    methods:{
        /*
        increment(value) {
            return this.$store.commit('JIA', value)
        },
        decrement(value) {
            return this.$store.commit('JIAN', value)
        }
        */
        //靠mapActions生成:increment、decrement(对象形式)
        ...mapMutations({increment:'JIA',decrement:'JIAN'}),
        
        //靠mapMutations生成:JIA、JIAN(对象形式)
        ...mapMutations(['JIA','JIAN']),
    }
    

备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

五、vuex模块化+namespace命名空间

1、目的

让代码更好维护,让多种数据分类更加明确。

2、修改store.js

const countAbout = {
  namespaced:true,//开启命名空间
  state:{x:1},
  mutations: { ... },
  actions: { ... },
  getters: {
    bigSum(state){
       return state.sum * 10
    }
  }
}

const personAbout = {
  namespaced:true,//开启命名空间
  state:{ ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    countAbout,
    personAbout
  }
})

3、组件中读取state数据

开启命名空间后

//方式一:自己直接读取
this.$store.state.personAbout.list
//方式二:借助mapState读取:
...mapState('countAbout',['sum','school','subject']),

4、组件中读取getters数据

开启命名空间后

//方式一:自己直接读取
this.$store.getters['personAbout/firstPersonName']
//方式二:借助mapGetters读取:
...mapGetters('countAbout',['bigSum'])

5、组件中调用dispatch

开启命名空间后

//方式一:自己直接dispatch
this.$store.dispatch('personAbout/addPersonWang',person)
//方式二:借助mapActions:
...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

6、组件中调用commit

开启命名空间后

//方式一:自己直接commit
this.$store.commit('personAbout/ADD_PERSON',person)
//方式二:借助mapMutations:
...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值