React Router不更改显示的组件

时间:2019-01-27 03:35:59

标签: javascript reactjs react-router

因此,我正在使用React-router开发React应用。我在更改路线时遇到问题,更改反映在URL中,但已安装的组件未更改。这是组件,它是我的主要容器组件之一:

class AppContent extends Component {

    state = {
        isStarted: false
    };

    componentDidMount = async () => {
        try {
            await this.props.checkIsScanning();
            this.setState({ isStarted: true });
        }
        catch (ex) {
            this.props.showErrorAlert(ex.message);
        }
    };

    componentWillUpdate(nextProps) {
        if (nextProps.history.location.pathname !== '/' && !nextProps.isScanning) {
            this.props.history.push('/');
        }
    }

    render() {
        return (
            <div>
                <VideoNavbar />
                {
                    this.state.isStarted &&
                    <Container>
                        <Row>
                            <Col xs={{ size: 8, offset: 2 }}>
                                <Alert />
                            </Col>
                        </Row>
                        <Switch>
                            <Route
                                path="/scanning"
                                exact
                                render={ (props) => (
                                    <Scanning
                                        { ...props }
                                        isScanning={ this.props.isScanning }
                                        checkIsScanning={ this.props.checkIsScanning }
                                    />
                                ) }
                            />
                            <Route path="/"
                                   exact
                                   render={ (props) => (
                                       <VideoListLayout
                                           { ...props }
                                           isScanning={ this.props.isScanning }
                                       />
                                   ) }
                            />
                        </Switch>
                    </Container>
                }
            </div>
        );
    }
}

const mapStateToProps = (state) => ({
    isScanning: state.scanning.isScanning
});

const mapDispatchToProps = (dispatch) => bindActionCreators({
    checkIsScanning,
    showErrorAlert
}, dispatch);

export default connect(mapStateToProps, mapDispatchToProps)(withRouter(AppContent));

因此,让我们专注于重要的东西。有一个redux属性isScanning,这对于此处的行为至关重要。默认情况下,当我打开应用程序时,路由为“ /”,并且VideoListLayout组件正确显示。从那里,我单击一个按钮以开始扫描,该扫描将路径更改为“ / scanning”,并显示“扫描”组件。除其他事项外,扫描组件会按一定间隔调用服务器以检查扫描是否完成。完成后,将“ isScanning”设置为false。重新提交AppContent时,如果“ isScanning”为false,则会将“ /”推送到历史记录上,以将用户送回主页。

这里几乎所有东西都可以工作。当我开始扫描时,将显示“扫描”组件,它可以很好地轮询服务器。扫描完成后,将正确更新redux,因此“ isScanning”现在为false。 AppContent中的componentWillUpdate()函数可以正常工作,并且可以将“ /”成功推送到历史记录中。 URL从“ / scanning”更改为“ /”,因此正在更改路由。

但是,“扫描”组件保持安装状态,而“ VideoListLayout”组件没有安装。我无法终生弄清为什么会这样。我以为一旦更改路线,组件也会随之改变。

我确定我在这里做错了什么,但我不知道那是什么。帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我很确定您遇到了react-router文档中描述的问题,其中react-redux的shouldComponentUpdate阻止您的组件在路由更改时重新呈现:https://reacttraining.com/react-router/core/guides/redux-integration/blocked-updates。这绝对是一个痛苦并且令人困惑的事情!

  

通常,React Router和Redux可以正常工作   一起。不过,有时应用程序可以包含一个   位置更改时(子路线或活动导航)不会更新   链接不会更新)。如果发生以下情况,则会发生这种情况:组件已连接到   通过connect()(Comp)进行redux。该组件不是“路由组件”,   表示它不是这样呈现的:问题是Redux实现   shouldComponentUpdate,并且没有任何迹象表明   如果它没有从路由器接收道具,则进行更改。这是   易于修复。查找连接组件的位置并包装   放在路由器中。

因此,在您的情况下,您只需要交换connect和withRouter的顺序:

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(AppContent));