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 相关文章推荐
用JS写的一个TableView控件代码
Jan 23 Javascript
返回对象在当前级别中是第几个元素的实现代码
Jan 20 Javascript
jQuery选择器中含有空格的使用示例及注意事项
Aug 25 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
jquery中object对象循环遍历的方法
Dec 18 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
angular2倒计时组件使用详解
Jan 12 Javascript
深究AngularJS之ui-router详解
Jun 13 Javascript
使用express来代理服务的方法
Jun 21 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
vue总线机制(bus)知识点详解
May 10 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编写大型网站问题集
2007/03/06 PHP
php 高效率写法 推荐
2010/02/21 PHP
php header功能的使用
2013/10/28 PHP
理解PHP中的stdClass类
2014/04/18 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
布同 统计英文单词的个数的python代码
2011/03/13 Python
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
快速入门python学习笔记
2017/12/06 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
Python解决八皇后问题示例
2018/04/22 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
文明生主要事迹
2014/05/25 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android
MySQL多表查询机制
2022/03/17 MySQL