Javascript vuex-作为函数或对象文本返回的状态
前几天我遇到了一个问题,并向great stack社区寻求解决方案 问题是: 我在其他模块中嵌套了相同的模块,但我是这样定义状态的:Javascript vuex-作为函数或对象文本返回的状态,javascript,vue.js,vuejs2,vuex,Javascript,Vue.js,Vuejs2,Vuex,前几天我遇到了一个问题,并向great stack社区寻求解决方案 问题是: 我在其他模块中嵌套了相同的模块,但我是这样定义状态的: state: { // some state here } 所发生的是我的所有模块,尽管它们看起来嵌套在不同的模块下,但所有模块都共享相同的状态 解决方案 解决方案是让函数返回状态,而不是将其定义为对象文本。为什么有点道理。以下是我的问题 新问题 当状态被定义为一个对象文本而函数返回一个对象文本时,在存储的后台会发生什么 为什么不使用函数版本?这似乎很容易成
state: {
// some state here
}
所发生的是我的所有模块,尽管它们看起来嵌套在不同的模块下,但所有模块都共享相同的状态
解决方案
解决方案是让函数返回状态,而不是将其定义为对象文本。为什么有点道理。以下是我的问题
新问题
当状态被定义为一个对象文本而函数返回一个对象文本时,在存储的后台会发生什么 为此,最好: 如您所见,上面的代码检查是否提供了
状态。如果不是,它将指定一个空对象({}
)作为初始状态
接下来,它检查状态
是否是函数
。如果是,则执行它并将返回的内容分配给状态。如果它返回了undefined
(或任何假值),它会再次将空对象{}
赋值给状态
这就是作为对象或函数提供state
之间的区别:如果提供了一个对象或函数,它就会被执行。如果提供了对象,则直接指定该对象
为什么不使用函数版本?这似乎很容易成为默认选择,但即使在vuex文档中的模块中,它们也选择将状态显示为对象文字
一般来说,是的,对象版本可能更常见,因为您通常只声明一次存储
对象(及其状态
),然后在Vue实例中使用它
状态
函数otoh的用例是:
模块重用
例如,有时我们可能需要创建一个模块的多个实例
例如:
- 创建使用同一模块的多个存储(例如,在启用runInNewContext选项时在SSR中)
错误或“一次”)李>
- 在同一个内存中多次注册同一模块
商店
另一种可能的情况是,仅声明一次Vuex模块,并尝试在不同名称空间下多次使用它
由于上述示例类似,下面是一个演示(模块案例)来说明问题:
const personModule={
名称空间:对,
国家:{name:“name”},
突变:{
更改名称(状态,数据){state.name=data}
}
}
const myStore=new Vuex.Store({
严格:是的,
模块:{
aliceNamespace:personModule,
bobNamespcace:个人模块
}
});
新Vue({
商店:myStore,
el:“#应用程序”,
安装的(){
本协议。更改Alice名称(“Alice”);
此项。更改BobName(“Bob”);
},
计算:{
…Vuex.mapState('aliceNamespace',{AliceName:'name'}),
…Vuex.mapState('bobNamespcace',{BobName:'name'})
},
方法:{
…Vuex.MapTranslations('aliceNamespace',{ChangeAliceName:'changeName'}),
…Vuex.MapTranslations('bobNamespcace',{ChangeBobBSName:'changeName'})
}
})
爱丽丝的名字:{{alicesName}
鲍勃的名字:{{bobsName}}
改变爱丽丝的名字
由于vuex是一个商店管理系统,因此状态有一个单独的insane是有意义的,请记住,我们正在从vuex保存和检索数据,因此状态必须是一个对象,否则函数每次都会返回新值DIT:更新答案,添加到vuex官方文档的模块重用部分的链接(他们明确提到了功能)。
state() {
return {
// state here instead
}
}
var Store = function Store (options) {
// ...
var state = options.state; if ( state === void 0 ) state = {};
if (typeof state === 'function') {
state = state() || {};
}