解决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 相关文章推荐
css样式标签和js语法属性区别
Nov 06 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
jQuery设置图片等比例缩小的方法
Apr 29 jQuery
JS实现按钮控制计时开始和停止功能
Jul 27 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
vue-cli webpack配置文件分析
May 20 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
微信小程序保存图片到相册权限设置
Apr 09 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
微信小程序上传文件到阿里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基础学习笔记
2007/03/18 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
js里面的变量范围分享
2020/07/18 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
Python常见异常分类与处理方法
2017/06/04 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
委托公证书
2014/04/08 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
关于五一放假的通知
2015/08/18 职场文书
体育教师研修感悟
2015/11/18 职场文书