vuex 动态注册方法 registerModule的实现


Posted in Javascript onJuly 03, 2019

Vuex(2.3.0+)可以用store.registerModule方法在进入路由时进行注册,离开路由时候销毁 actions, mutations, getters, state,在一定范围内相同名称不会被覆写

例子

index.js

传this 的写法

module.exports = {
  install(_this) {
    _this.$store.registerModule(['abc'], {
      namespaced: true,
      state: {
        rightTest: 999
      },
      actions: {
        setTest: ({commit}, val) => {
          commit('putTest', val)
        }
      },
      mutations: {
        putTest: (state, val) => {
          state.rightTest = val;
        }
      }
    })
  },
  uninstall(_this) {
    _this.$store.unregisterModule(['abc'])
  }
};

不传this,有写 store 的写法

import store from '../../store';

export default {
  install() {
    store.registerModule(['abc'], {
      namespaced: true,
      state: {
        rightTest: 999
      },
      actions: {
        setTest: ({commit}, val) => {
          commit('putTest', val)
        }
      },
      mutations: {
        putTest: (state, val) => {
          state.rightTest = val;
        }
      }
    })
  },
  uninstall() {
    store.unregisterModule(['abc'])
  }
}

调用方法时应该在创建完实例之后的钩子中,未创建实例调用会找不到 store。

在install、uninstall时,传递this过去,可以在上面中直接调用。

dispath 时,如果设置了命名空间,则一定要加上,我这个因为没使用较复杂的命名,注册时的名字就在命名空间那用了。

test.vue

import abc from '../../store/test';
...
created() {
  // 挂载对应的 store
  abc.install(this);
  console.log(this.$store, 'install');
},
destroyed() {
  // 销毁对应的 store
  abc.uninstall(this);
  console.info(this.$store, 'uninstall');
},
methods: {
 test(){
  this.$store.dispatch('abc/setTest', Math.random());
 }

总结

当范围内使用动态方法注册 actions 时还是比较爽的,而且在destroyed 钩子中销毁可以节省一部分资源;

配置命名空间也可以避免覆盖问题,算是多一种手段吧(感觉还是应用在多模块,全局注册时用到这个);

当没有父子关系时,但还需要多页面共享状态,可以用动态注册就不太方便了;
(我好像还是没解决全局注册时方法过多的问题。。。)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
插件:检测javascript的内存泄漏
Mar 04 Javascript
js 创建书签小工具之理论
Feb 25 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
jquery验证邮箱格式并显示提交按钮
Nov 07 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
Javascript实现倒计时(防页面刷新)实例
Dec 13 Javascript
jQuery手指滑动轮播效果
Dec 22 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
ES6入门教程之Class和Module详解
May 17 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
Dec 10 Javascript
JS开发自己的类库实例分析
Aug 28 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 #Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 #jQuery
使用vue实现各类弹出框组件
Jul 03 #Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
Jul 03 #Javascript
使用微信SDK自定义分享的方法
Jul 03 #Javascript
微信小程序判断页面是否从其他页面返回的实例代码
Jul 03 #Javascript
8 个有用的JS技巧(推荐)
Jul 03 #Javascript
You might like
php array_merge下进行数组合并的代码
2008/07/22 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
PHP判断指定时间段的2个方法
2014/03/14 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
JS array 数组详解
2009/03/22 Javascript
优化javascript的执行速度
2010/01/23 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
jquery foreach使用示例
2013/09/12 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
企业行政文员岗位职责
2013/12/03 职场文书
主持人演讲稿范文
2013/12/28 职场文书
求职毕业生自荐书
2014/02/08 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
导游个人求职信
2014/04/25 职场文书
社区创先争优承诺书
2014/08/30 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
房屋买卖协议样本
2014/11/16 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python