乐闻世界logo
搜索文章和话题

Mobx

MobX是一个基于信号的、经过实战测试的库,通过透明地应用函数式响应式编程,使状态管理变得简单和可扩展。
Mobx
如何在一个mobx store访问另一个mobx store?
在 MobX 中,如果需要在一个 store 访问另一个 store,通常有几种方法可以实现这一目标。以下是几种常见的做法: ### 1. 通过构造函数注入依赖 在创建一个 store 实例时,可以把其他需要的 store 作为参数传递进去。这种方式类似于依赖注入,它允许每个 store 在初始化时就可以知道其它的 store。 ```javascript class StoreA { constructor(storeB) { this.storeB = storeB; } get someData() { return this.storeB.someOtherData; } } class StoreB { someOtherData = "This is some data from StoreB"; } const storeB = new StoreB(); const storeA = new StoreA(storeB); ``` 在上面这个例子中,`StoreA` 在被创建时接收了 `StoreB` 的实例作为参数,并将其保存在自己的属性中。这样 `StoreA` 就可以方便地访问 `StoreB` 中的数据了。 ### 2. 通过 Root Store 模式 Root Store 模式涉及创建一个主要的 store,通常称为 `RootStore`,它将包含所有其他子 store 的引用。然后,每个子 store 可以在构造函数中接收 `RootStore` 实参,并从中访问其他 store。 ```javascript class StoreA { constructor(rootStore) { this.rootStore = rootStore; } get someData() { return this.rootStore.storeB.someOtherData; } } class StoreB { someOtherData = "This is some data from StoreB"; } class RootStore { constructor() { this.storeB = new StoreB(); this.storeA = new StoreA(this); } } const rootStore = new RootStore(); ``` 通过这种方式,所有的 store 都通过 `RootStore` 连接在一起,每个 store 都能够访问到根 store 中的其他 store 实例。 ### 3. 使用 MobX 的 `context` 在使用 React 和 MobX 时,可以利用 React 的 context 系统来传递 stores。这对于在 React 组件树中访问 stores 特别有用。 ```javascript import React, { createContext, useContext } from 'react'; import { useLocalObservable } from 'mobx-react'; const StoreContext = createContext(null); export const StoreProvider = ({ children }) => { const store = useLocalObservable(() => ({ storeA: new StoreA(), storeB: new StoreB(), })); return <StoreContext.Provider value={store}>{children}</StoreContext.Provider>; }; export const useStores = () => useContext(StoreContext); ``` 在组件中使用 `useStores` 钩子函数,可以访问到 `storeA` 和 `storeB`: ```javascript const MyComponent = () => { const { storeA, storeB } = useStores(); // 使用 storeA 和 storeB }; ``` 这些方法都提供了在不同 store 之间相互访问的方式,每种方式都有其适用场景和利弊。构造函数注入依赖和 Root Store 模式更适合于非 React 或者大型的 React 项目,而 context 方法则是专为 React 设计的。在实际项目中,应根据具体的架构需求和团队习惯选择合适的方法。在MobX中,有几种方法可以在一个store中访问另一个store。下面是常见的几种方法: ### 1. 通过构造函数注入 一个简单而直接的方法是在创建Store的时候,将其他的Store作为参数传递给它。例如: ```javascript class StoreA { constructor(storeB) { this.storeB = storeB; } } class StoreB { // StoreB的方法和属性 } const storeB = new StoreB(); const storeA = new StoreA(storeB); ``` 这种方法的好处是清晰地声明了依赖,而且易于测试,因为你可以很容易地传递mocks或stubs。 ### 2. 使用根store 通常,在较大的应用程序中,你会有一个“根”store,它持有其他所有子store的实例。这样,每个子store都可以通过根store访问其他的store。 ```javascript class RootStore { constructor() { this.storeA = new StoreA(this); this.storeB = new StoreB(this); } } class StoreA { constructor(rootStore) { this.rootStore = rootStore; } someMethod() { // 直接通过根store访问StoreB的方法或属性 return this.rootStore.storeB.someProperty; } } class StoreB { // StoreB的方法和属性 } const rootStore = new RootStore(); ``` 这种方式的好处是每个store都知道如何找到它需要的任何其他store,而不需要额外的引用或配置。 ### 3. 使用Context(React环境下) 如果你的应用是用React开发的,并且你正在使用MobX来管理状态,则可以利用React的Context API来跨组件传递stores。 ```javascript import React, { createContext, useContext } from 'react'; const StoreContext = createContext(); const StoreProvider = ({ children, store }) => { return ( <StoreContext.Provider value={store}>{children}</StoreContext.Provider> ); }; // 使用自定义hook来访问store const useStores = () => useContext(StoreContext); // 在组件中使用 const MyComponent = () => { const { storeA, storeB } = useStores(); // ... }; ``` 在这种情况下,你可以在应用程序的顶部使用一个`StoreProvider`包装你的组件树,然后在需要的任何地方通过`useStores`自定义hook访问stores。 ### 4. 使用全局变量或模块 虽然通常不推荐使用全局变量,但在某些简单的应用或快速原型制作中,你可能会选择简单地将stores作为全局变量或导出它们作为模块的一部分,如下所示: ```javascript // stores.js export const storeA = new StoreA(); export const storeB = new StoreB(storeA); ``` 然后在需要的地方导入它们: ```javascript import { storeA, storeB } from './stores'; // 使用storeB中的方法或属性 storeA.someMethod(storeB.someProperty); ``` 这种方法简单快捷,但在大型应用程序中,它可能导致难以维护的代码和不清晰的依赖关系。 --- 以上是几种在MobX中让store相互访问的方法。根据你的应用程序的具体需求和结构选择合适的方法。
阅读 109 · 6月27日 12:12