Vuex插件的基本原理和使用

vuex是什么

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

什么时候使用Vuex

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

Vuex工作原理

官方vuex工作原理图

分析:

  • 首先我们可以看到上图中有一个绿色虚线框框起来的部分,绿色字体写着Vuex,说明Vuex包含这这三个重要组成部分,Actions(有一堆动作行为的意思),Mutations(一堆加工修改的意思),State(状态也是数据),都是对象数据类型
  • 最左边绿色背景的圆角矩形框框着的是Vue Components(指Vue组件,加上s代表多个组件的意思)
  • Dispatch这是一个API,dispatch是个函数,需要传两个参数
  • Commit这是一个API,commit是个函数,需自己调用
  • Actions和Mutations里面包含很多组key,value,前面传过来的一定有一个key为动作,value为function函数,
  • Mutate(加工修改维护的意思),不是API,底层自己调用。
  • Render(渲染的意思)
  • Backend API(后端接口的意思)
  • Vue Components不一定要经过Actions到达Mutations,可以直接从Vue Components到Mutations
  • Devtools是vuex官方出的一个开发者调试工具
  • Actions,Mutations,State都要经过store(仓库)的领导

搭建Vuex环境

步骤:

  1. 安装Vuex:npm i vuex@3(注意版本不要太高,容易出问题)
  2. 在src文件夹下准备一个store文件夹,在这个store文件夹里面准备一个index.js文件,该文件用于创建Vuex中最为核心的store
  3. 核心的store里面(一)首先需要引入:①Vue:import Vue from 'vue',②Vuex:import Vuex from 'vuex',然后使用这个插件:③Vue.use(Vuex),(二)接着准备actions、mutations、state三个object对象,(三)创建并暴露store,store里面的配置对象传入刚刚准备的三个object对象
  4. 在入口函数main.js使用这个插件:(1)引入store:import store from './store/index'(2)在创建vm时传入store配置项

代码示例:

(1)创建文件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
})

Vuex的基本使用

步骤:

  1. 初始化数据,配置actions、配置mutations,操作文件store.js
  2. 组件中读取vuex中的数据:$store.state.属性名
  3. 组件中修改vuex中的数据:$store.dispatch('actions中的方法名',数据)或$store.commit('mutations中的方法名',数据)

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

getter的使用

概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。(类似computed)

步骤:

  1. 在store.js中追加getter配置(注意得写返回值)
  2. 组件中读取数据:$store.getters.对象名

四个map方法的使用

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

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

代码示例:

computed: {
    //借助mapState生成计算属性:sum、school、subject(对象写法)
     ...mapState({sum:'sum',school:'school',subject:'subject'}),
         
    //借助mapState生成计算属性:sum、school、subject(数组写法)
    ...mapState(['sum','school','subject']),
},

mapGetters方法:用于帮助我们映射getters中的数据为计算属性

代码示例:

computed: {
    //借助mapGetters生成计算属性:bigSum(对象写法)
    ...mapGetters({bigSum:'bigSum'}),

    //借助mapGetters生成计算属性:bigSum(数组写法)
    ...mapGetters(['bigSum'])
},

mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数

代码示例:

methods:{
    //靠mapActions生成:incrementOdd、incrementWait(对象形式)
    ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

    //靠mapActions生成:incrementOdd、incrementWait(数组形式)
    ...mapActions(['jiaOdd','jiaWait'])
}

mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数

代码示例:

methods:{
    //靠mapActions生成:increment、decrement(对象形式)
    ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    
    //靠mapMutations生成:JIA、JIAN(对象形式)
    ...mapMutations(['JIA','JIAN']),
}

模块化+命名空间

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

修改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
  }
})

开启命名空间后,组件中读取state数据:

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

开启命名空间后,组件中读取getters数据:

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

开启命名空间后,组件中调用dispatch

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

开启命名空间后,组件中调用commit

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

猜你喜欢

转载自blog.csdn.net/m0_61843874/article/details/124616969