赞
踩
场景
项目A升级改造,需要用到另一个B项目的其中一个模块,A项目使用的是nuxt,而B项目使用的是原生vue, 合并的时候,直接将B项目对应的store文件复制到了A项目的store目录下,运行时,报错:
Do not mutate vuex store state outside mutation handlers.
分析
我们都知道无论是vuex,redux还是mobx,都有严格模式和非严格模式,区分就是能不能直接修改store到处的state,严格模式下是不允许的,只能通过action,mutation去修改,而非严格模式下才可以直接修改state数据。上面报错就是因为在严格模式下直接修改了state数据。
解决
分析了原因之后,着手解决,因为nuxt默认在开发模式的时候开启严格模式,打开nuxt官网,搜索到所有严格模式相关的内容如下
默认情况下,在开发模式下启用严格模式,在生产模式下关闭模式。要在dev中禁用严格模式,请遵循以下示例。
Module Mode
export const strict = false
于是我在从B项目引入的模块文件下加入:
export const strict = false
我的想法是,因为这个模块有state被直接修改,那个申明这个模块为非严格模式。
保存,重启项目,继续报错。
无奈继续寻找原因,后来看见有人说:
要在store/index.js添加export const strict = false
突然明白了,在原生的vuex配置重,strict这个配置是在new Vuex.Store()是传入的配置,而modules中并没有这个配置项,也就是说,要么整个store都是严格模式,要么都是非严格模式,不存在一个模块是严格模式,另一个模块是非严格模式这种操作,但是nuxt中并没有提供我们配置store的地方,store/index.js的配置应该就是对应store的顶级配置吧。
查看了我的目录结构,发现并没store/index.js文件,于是新建store/index.js,添加
export const strict = false
保存,重启,错误消失。
但是此时整个store都是非严格模式,并不是优雅的解决方案,建议开发环境下还是使用严格模式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。