Reactjs MobX,React Router v4,使用渲染功能进行路由,在存储更改时不观察并重新渲染
使用需要道具传递到组件的路由,我传递的是一个可以从我的存储中观察到的布尔值。当此值更改时,由管线渲染的组件不会更新Reactjs MobX,React Router v4,使用渲染功能进行路由,在存储更改时不观察并重新渲染,reactjs,mobx,Reactjs,Mobx,使用需要道具传递到组件的路由,我传递的是一个可以从我的存储中观察到的布尔值。当此值更改时,由管线渲染的组件不会更新 <Switch> <Route exact path="/" render={()=><MyComponent isLoading={this.props.MyMobxStore.ShowMyComponentLoader} />} /> </Switch> } /> 此组件是可观察的,并注入MyMobxStore
<Switch>
<Route exact path="/" render={()=><MyComponent isLoading={this.props.MyMobxStore.ShowMyComponentLoader} />} />
</Switch>
} />
此组件是可观察的,并注入MyMobxStore。如果我更改了该可观察对象,则不会重新呈现组件“MyComponent”,也不会通知该更改
如果我在顶层组件上调用任意的“setState”,它就会工作。或者如果我添加一个虚拟元素,比如
<div idk={this.props.MyMobxStore.ShowMyComponentLoader}/>
这会使当前组件重新呈现,从而使依赖于此可观察对象的“MyComponent”的行为符合预期
有没有一个明显的解决方案是我遗漏的?我可以添加这些黑客之一,使其工作。我可以将我的“MyComponent”包装在另一个可观察的对象中,并以这种方式传递它,但这对我的设计不利。虽然没那么重要。在这一点上,这纯粹是学术性的。我想知道为什么它不起作用
更新
被要求包含更多的代码
import React,{Component}来自'React';
从“react Router dom”导入{BrowserRouter as Router,Route,Switch,Link};
从“mobx react”导入{inject,observer};
从.coomComponents'导入{MyComponent,CoolChildComponent};
@注入('LoaderStore')
@观察者
类应用程序扩展组件{
组件willmount(){
this.props.LoaderStore.setShowLocalLoader(true);
设置超时(()=>{
this.props.LoaderStore.setShowLocalLoader(false);
}, 5000);
}
render(){
报税表(
{/*注意路由器容器和“带路由器”包装器向上一级。*/}
{return}}/>
);
}
}
导出默认应用程序代码>听起来您缺少MyComponent的观察者包装
如果您支持decorators,则可以使用@observer,否则应启用decorators,如图所示
希望这有帮助,如果这是问题所在,这里有一点解释:
当您在mobx存储中设置一个可观察对象时,您可以通过几种方式对该可观察对象的更改做出反应(我只是在清单2中列出更多选项,请参阅mobx文档):
使用自动运行
使用@observable-
这两种方法的工作原理相同,只是在可观察选项中,渲染函数的工作原理与自动运行类似
如果你在函数中有一个可观察的对象,它会在每次函数范围中的可观察对象发生变化时触发它,这是非常简单的
祝你好运 尝试以下操作:
render() {
const showLocalLoader = this.props.LoaderStore.showLocalLoader
return(
<div>
{/* note router container and "with router" wrapper one level up. */}
<Switch>
<Route render={()=>{return <MyComponent isLoading={showLocalLoader}><CoolChildComponent/></MyComponent>}} />
</Switch>
</div>
);
}
render(){
const showLocalLoader=this.props.LoaderStore.showLocalLoader
报税表(
{/*注意路由器容器和“带路由器”包装器向上一级。*/}
{return}}/>
);
}
这将导致将正确的值作为道具发送到路线,
存在这样一个问题:当可观察对象嵌套在render的返回值中时,值的更改有时不会触发重新渲染
让我知道它是否有效MyComponent标记为可观察。但这不是问题所在,如果我直接使用MyComponent中存储的可观察值,它会按预期工作,但如果我将可观察值作为道具传递,它不会。我可以用三种方法来解决这个问题。我只是不知道当前组件是否正在监视该值的使用,我将该值作为渲染函数内的道具传递给子组件。为什么react/mobx不触发更新。很明显,mobx没有看到它被使用。我只是不明白为什么。如果你能添加代码,或者按照你传播可观测数据的方式,我会更有帮助,只是为了确保,当你说组件是可观测的,你是指观察者?我添加了更多的代码。这就是我传递它的方式。我只是不明白为什么这样不行。我已经通过使用包装器组件解决了这个问题,但我想知道为什么这根本不起作用。宾果。这很有道理。我不知道为什么我没有想到那个。