Access stores from class using mobX and react Context
我在 mobx/mobx-react-lite 和 react 钩子上有点挣扎。
我想从一个班级更新我的一个商店中的一个属性,但不知何故我无法让它工作。以下是我的商店如何组合的一些示例,以及我想从中调用我的商店的组件和类。我正在使用 react 中的 Context 来获取我的钩子组件中的商店,并且效果很好。
// FooStore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import { observable, action } from"mobx"; import ExampleClass from"app/services/exampleClass"; export class FooStore { @observable public foo: string =""; @action public doSomething() { this.foo = ExampleClass.doSomething() } } export default FooStore; |
// 酒吧商店
1 2 3 4 5 6 7 8 9 10 11 12 13 | import { observable, action } from"mobx"; export class BarStore { @observable public bar: number = 0; @action public setBar(value: number) { this.bar } } export default BarStore; |
//Store(将store合二为一,用createContext()导出)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import { FooStore } from"./FooStore"; import { BarStore } from"./BarStore"; import { createContext } from"react"; class Store { public fooStore: FooStore; public barStore: BarStore; constructor(){ this.fooStore = new FooStore(); this.barStore = new BarStore(); } } const stores = new Store() export default createContext(stores); |
这是我希望能够调用我的 barStore 的类。 (注意,不是组件类)
//示例类
1 2 3 4 5 6 7 8 9 | export default class ExampleClass { public static doSomething(): string { // ... // Call BarStore.setBar(1000) return"Some string" } } |
任何人都可以将我推向正确的方向吗?
上下文是一个 React 概念。通过Context导出你的商店不好。 (可能您应该需要在另一个环境中使用它!)您应该导出存储本身并通过上下文将其package在您的最高级别组件中。
//你的商店:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import { FooStore } from"./FooStore"; import { BarStore } from"./BarStore"; class Store { public fooStore: FooStore; public barStore: BarStore; constructor(){ this.fooStore = new FooStore(); this.barStore = new BarStore(); } } const stores = new Store() export default stores; |
//App.js ...
1 2 3 4 5 6 7 8 9 10 | import store from './yourStore'; import { createContext } from"react"; const GlobalStore = createContext(store); export default () => { <GlobalStore.Provider> <Main /> </GlobalStore.Provider> } |
//任何其他js文件
1 2 3 4 5 6 7 8 9 10 11 | import store from './yourStore'; export default class ExampleClass { public static doSomething(): string { // ... store.BarStore.setBar(1000) return"Some string" } } |