Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs MobX,React Router v4,使用渲染功能进行路由,在存储更改时不观察并重新渲染_Reactjs_Mobx - Fatal编程技术网

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没有看到它被使用。我只是不明白为什么。如果你能添加代码,或者按照你传播可观测数据的方式,我会更有帮助,只是为了确保,当你说组件是可观测的,你是指观察者?我添加了更多的代码。这就是我传递它的方式。我只是不明白为什么这样不行。我已经通过使用包装器组件解决了这个问题,但我想知道为什么这根本不起作用。宾果。这很有道理。我不知道为什么我没有想到那个。