vuex是什么
概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
什么时候使用Vuex
- 多个组件依赖于同一个状态
- 来自不同组件的行为需要变更同一状态
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环境
步骤:
- 安装Vuex:npm i vuex@3(注意版本不要太高,容易出问题)
- 在src文件夹下准备一个store文件夹,在这个store文件夹里面准备一个index.js文件,该文件用于创建Vuex中最为核心的store
- 核心的store里面(一)首先需要引入:①Vue:import Vue from ‘vue’,②Vuex:import Vuex from ‘vuex’,然后使用这个插件:③Vue.use(Vuex),(二)接着准备actions、mutations、state三个object对象,(三)创建并暴露store,store里面的配置对象传入刚刚准备的三个object对象
- 在入口函数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的基本使用
步骤:
- 初始化数据,配置actions、配置mutations,操作文件store.js
- 组件中读取vuex中的数据:$store.state.属性名
- 组件中修改vuex中的数据:$store.dispatch(‘actions中的方法名’,数据)或$store.commit(‘mutations中的方法名’,数据)
备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit
getter的使用
概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。(类似computed)
步骤:
- 在store.js中追加getter配置(注意得写返回值)
- 组件中读取数据:$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'}),
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/6233.html