经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML5 » 查看文章
vuex 源码分析(六) 辅助函数 详解
来源:cnblogs  作者:大沙漠  时间:2019/9/19 9:11:32  对本文有异议

对于state、getter、mutation、action来说,如果每次使用的时候都用this.$store.state、this.$store.getter等引用,会比较麻烦,代码也重复和冗余,我们可以用辅助函数来帮助我们生成要的代码,辅助函数有如下四个:

    mapState(namespace, map)        ;用于获取state
    mapGetters(namespace, map)       ;用于获取getters
    mapMutations(namespace, map)      ;用于获取mutations
    mapActions(namespace, map)          ;用于获取actions

每个辅助函数都可以带两个参数:

  namespace     ;命名空间,也就是模块名

  map       ;要获取的信息

map有两种用法,可以是对象(键名是当前Vue实例设置的变量名,值是从store要获取的变量名)或者字符串数组(此时获取和设置的变量名为同一个)。

注:使用辅助函数需要在根节点注入store

ps:很多新手可能只会使用辅助函数,不知道还可以用this.$store.state,this.$store.getter这些用法...

这些辅助函数返回的都是一个对象,我们可以配合ES6的对象展开运算符,我们可以极大地简化写法,例如:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  7. <script src="https://unpkg.com/vuex@3.1.0/dist/vuex.js"></script>
  8. </head>
  9. <body>
  10. <div id="app">
  11. <p>{{no}}</p>
  12. <p>{{No}}</p>
  13. <button @click="test1">测试1</button>
  14. <button @click="test2">测试2</button>
  15. </div>
  16. <script>
  17. const store = new Vuex.Store({
  18. state:{no:100},
  19. getters:{
  20. No:function(state){return state.no+100}
  21. },
  22. mutations:{
  23. increment(state,payload){state.no+=payload.no;}
  24. },
  25. actions:{
  26. increment({commit},info){
  27. setTimeout(function(){
  28. commit('increment',info)
  29. },500)
  30. }
  31. }
  32. })
  33. var app = new Vue({
  34. el:"#app",
  35. store,
  36. computed:{
  37. ...Vuex.mapState(['no']),
  38. ...Vuex.mapGetters(['No'])
  39. },
  40. methods:{
  41. ...Vuex.mapMutations(['increment']),
  42. ...Vuex.mapActions({increment1:"increment"}),
  43. test1(){
  44. this.increment({no:100})
  45. },
  46. test2(){
  47. this.increment1({no:200})
  48. }
  49. }
  50. })
  51. </script>
  52. </body>
  53. </html>

writer by:大沙漠 QQ:22969969

我觉得吧,如果用到的vuex里的属性比较多还好一点,如果只用到一个state还不如用this.$store.state来获取呢,毕竟在node环境下还需要import{mapState} from 'vuex'来获取导出的符号,可以看页面具体的需求选择合理的方法。

 

源码分析


 vuex内的所有辅助函数格式都一样,都是执行一个normalizeNamespace()函数,并传入一个匿名函数,该匿名函数带有两个参数,分别是namespace和map,以mapState为例,如下:

  1. var mapState = normalizeNamespace(function (namespace, states) { //state辅助函数 name:命名空间 states:比如:count2: "count"
  2. var res = {};
  3. normalizeMap(states).forEach(function (ref) { //将states转换为对象格式,例如:[{key:count2,val:count}]
  4. var key = ref.key;
  5. var val = ref.val;
  6. res[key] = function mappedState () { //计算属性对应的是一个函数,该函数内的this指向的是Vue实例
  7. var state = this.$store.state; //获取state对象
  8. var getters = this.$store.getters; //获取getters对象
  9. if (namespace) {
  10. var module = getModuleByNamespace(this.$store, 'mapState', namespace);
  11. if (!module) {
  12. return
  13. }
  14. state = module.context.state;
  15. getters = module.context.getters;
  16. }
  17. return typeof val === 'function'
  18. ? val.call(this, state, getters) //state是函数时的逻辑,获取子模块的state会执行到这里
  19. : state[val] //返回state[val],也就是值
  20. };
  21. // mark vuex getter for devtools
  22. res[key].vuex = true;
  23. });
  24. return res
  25. });

normalizeNamespace是统一的一个入口,用于格式化所有的辅助函数,如下:

  1. function normalizeNamespace (fn) { //返回一个匿名函数,需要两个参数,分别是命名空间和映射,参数1可以省略
  2. return function (namespace, map) {
  3. if (typeof namespace !== 'string') { //如果参数1不是字符串(即忽略了命名空间)
  4. map = namespace; //则修正参数1为map
  5. namespace = ''; //重置命名空间为null
  6. } else if (namespace.charAt(namespace.length - 1) !== '/') {
  7. namespace += '/';
  8. }
  9. return fn(namespace, map) //最后执行fn函数
  10. }
  11. }

其它几个辅助函数都差不多,就是传给normalizeNamespace的函数内实现略有不同。

原文链接:http://www.cnblogs.com/greatdesert/p/11430122.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号