vuex通常作为vue2项目中跨组件通信的桥梁(vue3中常用pinia) 其有五个api:
state(定义变量)、getters(监听变量)、 mutations(处理同步方法)、actions(处理异步方法)、moudels(将vuex分为多个板块)
1、安装vuex(vuex@3最适合vue2,vuex@4适合vue3)
npm i vuex@3
2、根据大多数开发者习惯 在src中新建名叫 store 的文件夹 index.js中初始化vuex modules放vuex的各个板块 在正常开发中 一般会是每个页面或每个板块作为一个modules
3、store的index.js中初始化vuex
注意!:若将红框部分的代码换为在main.js中编写 则会报错 至于为啥在main.js中就报错 我也不知道...有大佬懂的话可以在评论区讲解一下 求知欲超强~
4、导出store后 需要在main.js中注入到vue中
此时就算是vuex的基础搭建已完成了~
modules:
将vuex分为多个板块 因为在日常开发中 如果多个前端都在一个vuex中编写 则一定会导致git代码冲突和命名冲突 并且所有板块都堆在一起对后期维护很不友好
命名空间:vuex中getter、mutatios、actions的定义是全局的 可以避免在使用时 因定义的名字重复而产生的冲突 会影响vuex辅助函数的传参结构 具体用法看下文(日常开发中建议加上!)
state:
在vuex中定义变量的地方 相当于vue中的data( ){ return { } }
我们可以打印一下this.$store.state 看看这里面到底是外层的vuex 还是我们所写的modulesA
发现$sotre.state中一级参数有moduleA和初始化vuex时定义的test 所以获取该值的第一种方法:this.$store.state.modulesA.value
第二种方法使用vuex提供的辅助函数 mapState 可以将store中的属性映射到computed中 接受一个数组参数 数组中的值就是我们打印出来的$store.state中的值
getters:
监听state中变量的变化 相当于vue中的computed
因为使用了箭头函数 所以简化了写法 全写为:
newValue: ( state ) => { return state.value }
获取getters的方法:
和state同样的方法 打印一下getters 看看里面是啥 console.log( this.$store.getters )
所以 我们想要获取newValue的第一种方法:this.$store.getters[ "modulesA/newValue" ]
(可能有初学者看不懂 我解释一下 就是和我们平时获取对象的方法一样: obj.val或者obj[ "val" ] 只不过是因为modulesA/newValue 中有 / 所以只能用字符串获取)
第二种方法:mapGetters[ "moduleA",[ newtest ] ] 同样是在computed中获取 为什么和state的传参不一样呢?因为我们给moduleA加了命名空间 所以影响了mapGetters的传参
mutations:
处理同步方法,一般会用来修改state中的值
获取mutations的方法使用commit获取:
1、this.$store.commit( "moduleA/setValue" , "我是参数")
2、
命名空间为false时 mapMutatios的传参与mapState一致
actions:
处理异步方法 一般会在这里请求接口 并调用mutations中的方法修改state中的值
调用acitons使用dispatch:
1、this.$store.dispatch( "moduleA/getValueApi" , 参数)
2、
命名空间为false时 mapActions的传参与mapState一致