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 Archive Network 集合
May 12 Javascript
js优化针对IE6.0起作用(详细整理)
Dec 25 Javascript
页面加载完毕后滚动条自动滚动一定位置
Feb 20 Javascript
Javascript中对象继承的实现小例
May 12 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
Feb 28 Javascript
jquery自定义表格样式
Nov 23 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
Jan 21 Javascript
vue实现图片按比例缩放问题操作
Aug 11 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设置session值和cookies的学习示例
2014/03/21 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
拖动一个HTML元素
2006/12/22 Javascript
javascript CSS画图之基础篇
2009/07/29 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Python探索之自定义实现线程池
2017/10/27 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python入门之后再看点什么好?
2018/03/05 Python
python实现图片识别汽车功能
2018/11/30 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python爬虫如何解决图片验证码
2021/02/14 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
自荐信写法介绍
2014/01/25 职场文书
减负增效提质方案
2014/05/23 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
MYSQL常用函数介绍
2022/05/05 MySQL