为函数的每个实例创建一个唯一的存储值
Make a unique store value for each instance of a function
我试图为创建的函数的每个实例创建一个唯一的存储值,但出于某种原因,我创建的函数的每个实例都使用相同的存储值。
我正在创建一个简单的商店功能,然后在该功能内创建商店。但是即使商店是在函数的每个实例中创建的,它们也是共享的。为什么会这样。
这是一个codesandboxSandbox
这是代码
createStore.js
const createStore = (initialState) => {
const state = initialState;
const get = () => state;
const set = (key, value) => (state[key] = value);
return {
get,
set
};
};
export default createStore;
主要功能
import createStore from "./createStore";
import initialState from "./initialState";
const controller = () => {
const store = createStore(initialState);
const setStore = (key, val) => store.set(key, val);
const getStore = () => store.get().string;
return {
setStore,
getStore
};
};
export default controller;
然后我尝试通过创建控制器的多个实例来使用它们,如下所示:
import controller from "./controller";
const ctl1 = controller();
const ctl2 = controller();
ctl1.setStore('string', 'Hello')
ctl2.setStore('string', 'Welcome')
clt1.getStore() // will output the last set store value of ctl2
看起来问题在于您正在导入的 initialState
是您用来启动商店状态的共享参考。所以问题不在于你的商店代码被正确解耦(似乎是),而是你正在操纵相同的底层引用对象 initialState
.
修复方法 1
您可以通过 cloning/copying initialState
而不是直接使用它的引用来解决这个问题。
以下是 lodash 的示例:
import { cloneDeep } from 'lodash';
/* ... */
const store = createStore(cloneDeep(initialState));
这是该方法的代码框:
https://codesandbox.io/s/modern-frog-npd2w
修复方法 2
您可以考虑的另一种选择是不使用 initialState
的共享单例模块,而是将其作为创建初始状态的工厂函数,这也可以解决同样的问题:
import { createInitialState } from './initialState';
/* ... */
const initialState = createInitialState();
const store = createStore(initialState);
我试图为创建的函数的每个实例创建一个唯一的存储值,但出于某种原因,我创建的函数的每个实例都使用相同的存储值。
我正在创建一个简单的商店功能,然后在该功能内创建商店。但是即使商店是在函数的每个实例中创建的,它们也是共享的。为什么会这样。
这是一个codesandboxSandbox
这是代码
createStore.js
const createStore = (initialState) => {
const state = initialState;
const get = () => state;
const set = (key, value) => (state[key] = value);
return {
get,
set
};
};
export default createStore;
主要功能
import createStore from "./createStore";
import initialState from "./initialState";
const controller = () => {
const store = createStore(initialState);
const setStore = (key, val) => store.set(key, val);
const getStore = () => store.get().string;
return {
setStore,
getStore
};
};
export default controller;
然后我尝试通过创建控制器的多个实例来使用它们,如下所示:
import controller from "./controller";
const ctl1 = controller();
const ctl2 = controller();
ctl1.setStore('string', 'Hello')
ctl2.setStore('string', 'Welcome')
clt1.getStore() // will output the last set store value of ctl2
看起来问题在于您正在导入的 initialState
是您用来启动商店状态的共享参考。所以问题不在于你的商店代码被正确解耦(似乎是),而是你正在操纵相同的底层引用对象 initialState
.
修复方法 1
您可以通过 cloning/copying initialState
而不是直接使用它的引用来解决这个问题。
以下是 lodash 的示例:
import { cloneDeep } from 'lodash';
/* ... */
const store = createStore(cloneDeep(initialState));
这是该方法的代码框: https://codesandbox.io/s/modern-frog-npd2w
修复方法 2
您可以考虑的另一种选择是不使用 initialState
的共享单例模块,而是将其作为创建初始状态的工厂函数,这也可以解决同样的问题:
import { createInitialState } from './initialState';
/* ... */
const initialState = createInitialState();
const store = createStore(initialState);