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中获取事件对象的方法小结
Mar 13 Javascript
js history对象简单实现返回和前进
Oct 30 Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 Javascript
浅析JavaScript中的对象类型Object
May 26 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
May 27 Javascript
AngularJS 表达式详解及实例代码
Sep 14 Javascript
js实现短信发送倒计时功能(正则验证)
Feb 10 Javascript
vue中SPA单页面应用程序详解
Nov 07 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 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
解析php5配置使用pdo
2013/07/03 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
管理信息系学生的自我评价
2014/01/11 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
教室标语大全
2014/06/21 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
让世界充满爱观后感
2015/06/10 职场文书
爱的教育读书笔记
2015/06/26 职场文书
银行培训心得体会范文
2016/01/09 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
python神经网络编程之手写数字识别
2021/05/08 Python
python面向对象版学生信息管理系统
2021/06/24 Python