Javascript 安装摘要,在另一个模块中实现的实时可解析Vuex存储?

Javascript 安装摘要,在另一个模块中实现的实时可解析Vuex存储?,javascript,vue.js,vuex,es6-modules,Javascript,Vue.js,Vuex,Es6 Modules,我有两个模块,我们称它们为core和implementation。如何设置存储以使核心中的内容依赖于实现提供的假定存储 在实现的存储中,我正在做类似的事情: import Core from 'core' export default new Vuex.Store( new Core().defaultStore ) 这将注册默认状态、突变、操作和getter(设置允许实现的用户扩展/修改核心提供的默认存储) 当试图访问非vue JS文件中的getter时,core中的操作会出现问题

我有两个模块,我们称它们为
core
implementation
。如何设置存储以使
核心
中的内容依赖于
实现提供的假定存储

实现
的存储中,我正在做类似的事情:

import Core from 'core'

export default new Vuex.Store(
    new Core().defaultStore
)
这将注册默认状态、突变、操作和getter(设置允许
实现
的用户扩展/修改
核心
提供的默认存储)

当试图访问非vue JS文件中的getter时,
core
中的操作会出现问题

export default class SomeClassInCore {
    exampleMethod() {
        // The getters will not be accessible here!
        return store.getters.someKey
    }
}
是否有某种方法可以实现“主”存储的“运行时”解析?我在考虑是否可以使用
窗口
访问由
实现
repo创建的Vue实例

我试过这样做

import store from './store.js'
import Vue from 'vue'
import { CoreVueTools } from 'core'

window.Vue = Vue
window.store = store

Vue.use(CoreVueTools)

new Vue({
    el: '#app',
    store
})
exampleMethod() {
    return window.store.getters.someKey
}
然后像这样访问它

import store from './store.js'
import Vue from 'vue'
import { CoreVueTools } from 'core'

window.Vue = Vue
window.store = store

Vue.use(CoreVueTools)

new Vue({
    el: '#app',
    store
})
exampleMethod() {
    return window.store.getters.someKey
}

这是可行的,但我对这个解决方案不太满意,总有比依赖窗口更好的方法吧?我可以使用另一种设计模式吗?

我不确定这是否符合您正在寻找的解决方案的方向(因为它不依赖vuex),如果不是,我希望它至少会有点有趣……

我可以使用另一种设计模式吗

您可以尝试一种非常简单(但还不太广为人知)的方法,使用基于()的方法来处理状态管理。我最近用react和riot.js应用程序实现了这个模式,与redux和co相比,它的样板代码非常少,运行得非常好(除了作为流提供的东西之外,没有依赖项,但你也可以自己实现!)。我还没有机会用vue尝试它(在我的待办事项列表上),所以下面的代码只是从中的“设置”示例中快速(并减少)的翻版

减数分裂模式的基本思想是依靠流来实现反应式循环,并将状态管理代码与视图代码分离。模式的快速总结(摘自主页):

  • 从初始状态开始
  • 创建补丁的更新流
  • 修补程序可以是Patchinko修补程序、函数修补程序或您自己的修补程序
  • 创建向更新流发布补丁的函数的actions对象
  • 通过对具有初始状态的更新流进行扫描,并对函数补丁使用
    (x,f)=>f(x)
    ,创建状态流
  • 将状态和操作传递给视图
甚至可以在SO代码段中工作的东西=):

(对于关键部分,请跳到回答的最后)

.row{
垫底:0.5雷姆;
}
钮扣{
显示:内联块;
填充:0 1rem;
颜色:#555;
文本对齐:居中;
字体大小:0.75rem;
字号:600;
线高:1.5雷姆;
字母间距:1px;
文本转换:大写;
文字装饰:无;
空白:nowrap;
背景色:透明;
边界半径:0.25雷姆;
边框:1px实心#bbb;
光标:指针;
框大小:边框框;
}
按钮:悬停,
按钮:焦点{
颜色:#333;
边框颜色:#888;
大纲:0;
}

//为了方便起见,让我们定义一个初始状态
常量初始状态={
温度:{
价值:22,
单位:“C”
}
};
//$update是一个补丁函数流
//这里传递的补丁函数正在执行
//什么都没有,它接受状态并返回,
//只是为了一致性。。。
const update=flyd.stream(state=>state);
//定义另一个流以累积补丁
//从初始状态开始
const getState=flyd.scan(
(状态,patchFn)=>patchFn(状态),
初始状态,
更新,
);
//动作是接受输入的函数
//并传递适当的补丁函数
//到更新流
常量动作={
changeTemp:amount=>update(状态=>({
……国家,
温度:{
…状态,温度,
值:state.temperature.value+数量
}
})),
changeTempUnit:()=>更新(状态=>({
……国家,
温度:{
…状态,温度,
单位:state.temperature.unit==“C”?“F”:“C”,
值:state.temperature.unit==“C”
数学四舍五入((state.temperature.value*9)/5+32)
:数学四舍五入((state.temperature.value-32)/9)*5)
}
}))
};
//通过结合actions和getState定义全局存储
常数存储={
getState,
行动
};
新Vue({
el:“应用程序”,
组成部分:{
“临时工”:{
数据(){
const initial=store.getState();
返回{
温度:初始温度值,
单位:初始温度单位
};
},
安装的(){
store.getState.map(s=>{
this.temperature=s.temperature.value;
this.unit=s.temperature.unit;
});
},
方法:{
incTemp(){
存储操作更改温度(+1);
},
decTemp(){
store.actions.changeTemp(-1);
},
变更单位(){
store.actions.changeTempUnit();
}
},
道具:[],
模板:`
+ 
&负的;
温度为{temperature}}°;{unit}
变温装置
`
}
}
});

您是否考虑过将存储传递给
示例方法
(例如,从带有
this.$store的Vue组件)
?假设
实现
可以了解
核心
,但反之亦然,让
core
导出一个静态回调方法,该方法用于传递对
store
的引用,该引用在
implementation
中实例化,类似于
core.setStore(storeInstance)