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 相关文章推荐
jQuery 技巧大全(新手入门篇)
May 12 Javascript
javascript控制frame,iframe的src属性代码
Dec 31 Javascript
Jquery实现视频播放页面的关灯开灯效果
May 27 Javascript
Js放到HTML文件中的哪个位置有什么区别
Aug 21 Javascript
jQuery实现的超简单点赞效果实例分析
Dec 31 Javascript
JavaScript之Vue.js【入门基础】
Dec 06 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 jQuery
switchery按钮的使用方法
Dec 18 Javascript
对angular4子路由&辅助路由详解
Oct 09 Javascript
js实现录音上传功能
Nov 22 Javascript
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
微信小程序中如何使用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_unique() - 去除数组中重复的元素值
2011/10/29 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
PHP网络操作函数汇总
2015/05/18 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
详解python中的异常捕获
2020/12/15 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
最新茶叶店创业计划书
2014/01/14 职场文书
职称评定自我鉴定
2014/03/18 职场文书
赔偿协议书
2015/01/27 职场文书
2015年工商所工作总结
2015/05/21 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript