React-router - 组件在父组件状态更改时重新加载?

Posted

技术标签:

【中文标题】React-router - 组件在父组件状态更改时重新加载?【英文标题】:React-router - component reloads on parent component state change? 【发布时间】:2018-06-15 13:40:02 【问题描述】:

在我的 React 应用程序中,我有一个来自 material-ui's demo 的 ResponsiveDrawer 组件。它基本上只是一个 React 组件,它呈现一个带有菜单项列表、标题栏和内容框架的抽屉。

它的状态有mobileOpen

state = 
    mobileOpen: false
;

当用户点击汉堡图标时会发生变化

handleDrawerToggle = () => 
    this.setState( mobileOpen: !this.state.mobileOpen );
;

(...)

<Drawer type="temporary" anchor="left" open=this.state.mobileOpen classes=paper: classes.drawerPaper onRequestClose=this.handleDrawerToggle ModalProps=keepMounted: true // Better open performance on mobile.>
    <div>
        <div className=classes.drawerHeader />
        <Divider />
        <MenuList onRequestClose=this.handleDrawerToggle />
    </div>

我还在 ResponsiveDrawer 的内容中设置了一些路由:

<main className=classes.content>
    <div className=classes.contentWrapper>
        <Switch>
            <Route
                exact
                path="/currencies"
                component=CurrenciesComponent
            />
            <Route
                exact
                path="/"
                component=ProfileComponent
            />
            <Route component=NotFoundComponent />
        </Switch>
    </div>
</main>

来自路由的CurrenciesComponent定义如下:

const CurrenciesComponent = () => (
        <Currencies isSignedIn=this.isSignedIn />
    );

当我单击汉堡图标时,ResponsiveDrawer 的状态会发生变化,但 CurrenciesComponent 也会重新加载(我在那里有一个 API 调用需要几秒钟才能完成,所以我想避免这种情况)。

如果我按如下方式定义我的路线(不将道具传递给货币组件),则不会发生这种情况:

<Route exact path="/currencies" component=Currencies />

那么如何在指定路由的同时避免重新渲染并为 Currencies 提供 props 呢?

【问题讨论】:

【参考方案1】:

我通过使用 render 而不是 component 属性解决了这个问题:

<Route exact path="/currencies" render=CurrenciesComponent/>

【讨论】:

【参考方案2】:

您可以告诉您的组件是否应该更新。

作为 React 生命周期的一部分,每个组件都有 shouldComponentUpdate 方法,每次收到更新信号时都会运行该方法。从此函数返回 true 将告诉组件更新,而 false 将告诉它不要更新。

由于您所做的只是要求它在道具保持不变的情况下不渲染,因此您可以使用PureComponent 而不是 Component。 PureComponent 实现了shouldComponentUpdate,除非 props 或 state 发生变化,否则不会更新。

【讨论】:

我认为这与子组件的生命周期无关。原因是,在我的第一个示例中调用了 Currencies 组件的构造函数。因此,无论 shouldComponentUpdate 如何,它都会更新。 构造函数被调用了两次?一次加载,一次打开抽屉? 没错,但只有当我像&lt;Route exact path="/currencies" component=() =&gt; ( &lt;Currencies /&gt; )那样将函数传递给路由的组件道具时才会发生这种情况@

以上是关于React-router - 组件在父组件状态更改时重新加载?的主要内容,如果未能解决你的问题,请参考以下文章

react-router:从组件或存储更改路由

React 子组件在父组件中更新状态后如何将其重置回原始状态

React 父/子状态更改设计问题

React-Router 在路由更改时重新安装组件

如何使用 react-router 在组件中保存表单的状态

在父组件的值更改时更新子组件中的值