MOBX- React 仅从 rootStore 注入单个商店
MOBX- React only inject single store from rootStore
我想对我的 React 组件实施响应式设计模式。因此,我使用 mobX,但我的核心设置并没有按预期工作。
我的设置是拥有一个根存储并在其中实例化所有子存储。 最后我只想在我的反应组件中注入需要的子商店。
UiStore
export default class UIStore {
@observable language = {};
constructor() {
autorun(() => {console.log(this.language)})
}
@action
async getLanguage() {
const response = await new Promise((resolve) =>
setTimeout(() => resolve({ language: 'en_GB' }), 1500)
);
runInAction(() => this.language = response);
}
}
根存储区
// Inject all stores in this root store
class RootStore {
constructor() {
this.uiStore = new UIStore(this);
}
}
const rootStore = new RootStore();
export default rootStore;
index.js
const Root = () => (
<MobXProvider rootStore={rootStore}>
<App webSocketClient={GlobalWSC}/>
</MobXProvider>
);
ReactDOM.render(<Root/>, document.getElementById('app'));
App.jsx
@inject(stores => ({
uiStore: stores.uiStore // <== this does not work only: stores.rootStore.uiStore
})
)
@observer
class App extends React.Component {
...
componentDidMount() {
console.log(this.props);
this.props.uiStore.getLanguage(); //throws error cannot find function getLanguage()
}
}
}
从App.jsx中的评论可以看出,注入子商店仅适用于stores.rootStore.uiStore
,但为什么呢?
那是因为你在 MobXProvider
中这样定义了它
为了获得所需的行为,请像这样定义它
const Root = () => (
<MobXProvider uiStore={uiStore}>
<App webSocketClient={GlobalWSC}/>
</MobXProvider>
);
当然这不是一个好的方法,因为你的根商店中会有更多商店,所以你将不得不以某种方式破坏你的根商店内部商店作为 MobXProvider
道具。虽然我不确定为什么会导致您出现问题(我一直在多个项目中使用您的语法)。
您可以执行此操作的一种方法
class RootStore {
constructor() {
this.stores = {
uiStore: new UIStore(this)
}
}
}
const Root = () => (
<MobXProvider {...rootStore.stores}>
<App webSocketClient={GlobalWSC}/>
</MobXProvider>
);
我想对我的 React 组件实施响应式设计模式。因此,我使用 mobX,但我的核心设置并没有按预期工作。 我的设置是拥有一个根存储并在其中实例化所有子存储。 最后我只想在我的反应组件中注入需要的子商店。
UiStore
export default class UIStore {
@observable language = {};
constructor() {
autorun(() => {console.log(this.language)})
}
@action
async getLanguage() {
const response = await new Promise((resolve) =>
setTimeout(() => resolve({ language: 'en_GB' }), 1500)
);
runInAction(() => this.language = response);
}
}
根存储区
// Inject all stores in this root store
class RootStore {
constructor() {
this.uiStore = new UIStore(this);
}
}
const rootStore = new RootStore();
export default rootStore;
index.js
const Root = () => (
<MobXProvider rootStore={rootStore}>
<App webSocketClient={GlobalWSC}/>
</MobXProvider>
);
ReactDOM.render(<Root/>, document.getElementById('app'));
App.jsx
@inject(stores => ({
uiStore: stores.uiStore // <== this does not work only: stores.rootStore.uiStore
})
)
@observer
class App extends React.Component {
...
componentDidMount() {
console.log(this.props);
this.props.uiStore.getLanguage(); //throws error cannot find function getLanguage()
}
}
}
从App.jsx中的评论可以看出,注入子商店仅适用于stores.rootStore.uiStore
,但为什么呢?
那是因为你在 MobXProvider
为了获得所需的行为,请像这样定义它
const Root = () => (
<MobXProvider uiStore={uiStore}>
<App webSocketClient={GlobalWSC}/>
</MobXProvider>
);
当然这不是一个好的方法,因为你的根商店中会有更多商店,所以你将不得不以某种方式破坏你的根商店内部商店作为 MobXProvider
道具。虽然我不确定为什么会导致您出现问题(我一直在多个项目中使用您的语法)。
您可以执行此操作的一种方法
class RootStore {
constructor() {
this.stores = {
uiStore: new UIStore(this)
}
}
}
const Root = () => (
<MobXProvider {...rootStore.stores}>
<App webSocketClient={GlobalWSC}/>
</MobXProvider>
);