MobX提示injector store不可用,请求排查代码错误原因
解决MobX报错:Store 'ProviderStore' is not available!
我来帮你定位并解决这个问题,你的代码里有几个关键错误导致了这个报错:
核心问题分析
- Provider的位置错误:MobX的
<Provider>需要在**组件树的上层(比如根组件)**提供Store实例,而不是在需要注入Store的DetailsScreen组件内部嵌套使用。你现在的写法相当于在组件自己内部找Store,但此时上层并没有提供,所以报错。 - 传递了Store类而非实例:你给
<Provider>传递的是ProviderState类本身,而MobX需要的是这个类的实例对象。 - 小拼写错误:
props.ProviderState.naame里多了一个字母a,应该是name,这个后续也会导致渲染错误。
修复步骤
1. 在根组件中提供Store实例
首先,找到你的应用根组件(比如App.tsx),在这里创建ProviderState的实例,并通过MobX的Provider把它提供给整个组件树:
import { Provider } from 'mobx-react'; import { ProviderState } from './states/provider.state'; import { DetailsScreen } from './screens/DetailsScreen'; // 创建Store实例,这里可以传入初始的IUser数据(如果有) const providerStore = new ProviderState({}); export default function App() { return ( {/* 这里的key要和你inject的名字完全一致:'ProviderState' */} <Provider ProviderState={providerStore}> <DetailsScreen /> </Provider> ); }
2. 修改DetailsScreen组件
移除组件内部的<Provider>,只保留注入和使用Store的逻辑,同时修正拼写错误:
import React, { useEffect } from 'react'; import { observer, inject } from 'mobx-react'; import { ProviderState } from './../states/provider.state'; import { API_URL } from './../../env.json'; // 建议定义props类型,代替any,提升类型安全性 interface DetailsScreenProps { ProviderState: ProviderState; } export const DetailsScreen = inject('ProviderState')(observer((props: DetailsScreenProps) => { useEffect(() => { const runEffects = async () => { const url = `${API_URL}/company/1`; // 注意:确保Http模块已经正确导入,不然这里会报错 const res = await Http.get(url); props.ProviderState.setProvider(res); }; runEffects(); }, []); return ( <View style={styles.body}> {/* 修复拼写错误:naame → name */} <MessageComponent textValue={props.ProviderState.name} /> </View> ); }));
3. 确保装饰器配置正确(TypeScript环境)
如果你用的是TypeScript,需要在tsconfig.json中开启装饰器支持,否则@observable和@action会失效:
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true } }
总结
MobX的核心流程是:上层组件通过Provider提供Store实例 → 下层组件通过inject获取对应Store → 用observer包裹组件实现响应式更新。你之前的错误把Provider放在了需要注入的组件内部,并且传递了类而非实例,导致inject找不到对应的Store,调整后就能正常工作了。
内容的提问来源于stack exchange,提问作者MegaRoks
相关产品推荐
相关产品推荐

