解决Vue+Electron下Vuex的Dispatch没有效果问题


Posted in Javascript onMay 20, 2019

这个问题是解决基于 vue 和 electron 的开发中使用 vuex 的 dispatch 无效的问题,即解决了 Please, don't use direct commit's, use dispatch instead of this. 问题。

先允许我梳理一下目录结构,以便阅读的时候不会一头雾水,你到底说的这个文件是哪个……

解决Vue+Electron下Vuex的Dispatch没有效果问题

其中 /src/main 是存放主配置文件的,/src/render 下面有 store、router、components 等。

components 下面就是很多 .vue 文件,router 下面就是一些路由配置的 js 文件和一些拦截器的 js。

关键是 store,store 下面有一个 index.js 的主配置文件 index.js,和一个 modules 文件夹。

index.js 里面写的是(记住这句话,后面会用到):

import Vue from 'vue'
import Vuex from 'vuex'
import { createPersistedState, createSharedMutations } from 'vuex-electron'
import modules from './modules'
Vue.use(Vuex)
export default new Vuex.Store({
 modules,
 plugins: [
 createPersistedState(),
 createSharedMutations()
 ],
 strict: process.env.NODE_ENV !== 'production'
})

而 modules/ 下面存放各个实体,例如上图中的 Auth.js 和 Counter.js,并通过 index.js 全部引入。

/**
 * The file enables `@/store/index.js` to import all vuex modules
 * in a one-shot manner. There should not be any reason to edit this file.
 */
const files = require.context('.', false, /\.js$/)
const modules = {}
files.keys().forEach(key => {
 if (key === './index.js') return
 modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
})
export default modules

然后来看一个 vuex 的官方样例:

const state = {
 main: 0
}
const mutations = {
 DECREMENT_MAIN_COUNTER (state) {
 state.main--
 },
 INCREMENT_MAIN_COUNTER (state) {
 state.main++
 }
}
const actions = {
 someAsyncTask ({ commit }) {
 // do something async
 commit('INCREMENT_MAIN_COUNTER')
 }
}
export default {
 state,
 mutations,
 actions
}

之后很显然的,我想要在 Vue 的组件调用 INCREMENT_MAIN_COUNTER 对计数器加 1。

this.$store.commit('INCREMENT_MAIN_COUNTER');
// this.$store.commit('INCREMENT_MAIN_COUNTER', payload);

如果是一般的 vue,就 OK 了,但是,我遇到了报错,说,Please, don't use direct commit's, use dispatch instead of this.

解决Vue+Electron下Vuex的Dispatch没有效果问题

那好吧,没事,不就是不然用 Commit,非要用 Dispatch 嘛,那我就写一个 Action,里面直接调用 Mutation,就像这个样子:

const actions = {
 JUST_INCREASE ({ commit }) {
 commit('INCREMENT_MAIN_COUNTER')
 }
}

然而奇怪的事情是,this.$store.dispatch('JUST_INCREASE') 并不能运行,没反应,计数器还是 0,不能赋值,就像是这个函数没有被执行一样。没有报错,没有任何异常,查也查不出什么问题。

解决Vue+Electron下Vuex的Dispatch没有效果问题

解决Vue+Electron下Vuex的Dispatch没有效果问题

网上的资料似乎也挺少。

折腾了很久,后来发现是 vuex-electron 里面一个插件的锅。

解决方法有两个。

方法一:

在 store/index.js 里面,就是上文特别强调了的那个文件,去掉 createSharedMutations 插件。

import Vue from 'vue'
import Vuex from 'vuex'
import { createPersistedState, createSharedMutations } from 'vuex-electron'
import modules from './modules'
Vue.use(Vuex)
export default new Vuex.Store({
 modules,
 plugins: [
 createPersistedState(),
 createSharedMutations() // 注释掉这一行
 ],
 strict: process.env.NODE_ENV !== 'production'
})

这是因为 vuex-electron 引入了一个用于多进程间共享 Vuex Store 的状态的插件。如果没有多进程交互的需求,完全可以不引入这个插件。

注释掉以后重启项目,用 this.$store.commit('XXX') 就可以使用了。
然而,如果需要多进程来处理怎么办?

方法二:

https://github.com/vue-electron/vuex-electron#installation

看第 3 条:

In case if you enabled createSharedMutations() plugin you need to create an instance of store in the main process. To do it just add this line into your main process (for example src/main.js):
  import './path/to/your/store'

这种时候就不能用第一种方法来解决问题了。
好在文档也说了,加上一行导入。
找到 /src/main/index.js,在前面加上一句:

import '../renderer/store'

解决Vue+Electron下Vuex的Dispatch没有效果问题

之后一切正常,可以使用 Dispatch 来进行操作了。

解决Vue+Electron下Vuex的Dispatch没有效果问题

最后还有一个比较奇怪的问题:

解决Vue+Electron下Vuex的Dispatch没有效果问题

在直接调用 state 的时候,这样写 this.$store.state.loginStatus 是不行的,会 undefined,必须写成 this.$store.state.Auth.loginStatus,就像是 this.$store.state.Counter.main 一样,似乎可以解释为,不同的模块不指定名字的话就找不到。

但是,在写 Dispatch 的时候又不需要指定名字了,直接 dispatch('changeLoginStatus') 就行了,不然难道不应该是也按照 dispatch('Auth/changeLoginStatus') 这样子来写嘛……

总结

以上所述是小编给大家介绍的解决Vue+Electron下Vuex的Dispatch没有效果问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
Aug 23 Javascript
多种方法判断Javascript对象是否存在
Sep 22 Javascript
jqueyr判断checkbox组的选中(示例代码)
Nov 08 Javascript
js数组去重的常用方法总结
Jan 24 Javascript
关于onchange事件在IE和FF下的表现及解决方法
Mar 08 Javascript
node.js中的console用法总结
Dec 15 Javascript
js点击按钮实现带遮罩层的弹出视频效果
Dec 19 Javascript
javascript ES6中箭头函数注意细节小结
Feb 17 Javascript
node.js中http模块和url模块的简单介绍
Oct 06 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
js的对象与函数详解
Jan 21 Javascript
微信小程序上传文件到阿里OSS教程
May 20 #Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
May 20 #Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
May 20 #Javascript
React如何实现浏览器打印部分内容详析
May 19 #Javascript
koa-router路由参数和前端路由的结合详解
May 19 #Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 #Javascript
利用Vue实现一个markdown编辑器实例代码
May 19 #Javascript
You might like
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
javascript异步编程的4种方法
2014/02/19 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
python中global与nonlocal比较
2014/11/21 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
易程科技软件测试笔试
2013/03/24 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
保险公司年会主持词
2014/03/22 职场文书
初中生物教学随笔
2015/08/15 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技