防止组件使用React-router卸载

Ale*_*kov 8 reactjs react-router

对于React-Router组件,我很沮丧.但是当我浏览链接时,我无法找到解释为什么我的组件会被卸载的原因?以及如何预防呢?

在我的示例中,我有一个包含计时器和重新呈现内容的组件

我收到一个错误:

在此输入图像描述

这是ReactJS代码:

/*global define, Backbone, React, $, Request, Router, Route, Link */

var App = React.createClass({
    render: function () {
        return (
            <div>
                <h1>App</h1>
                <ul>
                    <li><Link to="/about">About</Link></li>
                    <li><Link to="/timer">Timer</Link></li>
                </ul>
                {this.props.children}
            </div>
        )
    }
});

var About = React.createClass({
    render: function () {
        return <h3>Here is about page</h3>
    }
});

var Timer = React.createClass({
    getInitialState: function() {
        return {counter: 0};
    },
    render: function () {
        return (
            <div>
                <h2>Time is running over...</h2>
                <b>{this.props.interval}</b>
                <p>{this.state.counter}</p>
            </div>
        )
    },
    componentDidMount: function () {
        this.loadCommentsFromServer();
        setInterval(this.loadCommentsFromServer, 1000);
    },
    loadCommentsFromServer: function () {
        this.setState({counter: this.state.counter + 1});
    }
});

React.render((
    <Router location="history">
        <Route path="/" component={App}>
            <Route path="about" component={About} />
            <Route path="timer" component={Timer} />
        </Route>
    </Router>
), document.body);
Run Code Online (Sandbox Code Playgroud)

bas*_*sil 5

如果要再次显示组件而不卸载,则可以始终显示它,并在路线离开时隐藏。要达到这个位置,您需要在目标路线之外胜任,例如,您要防止ProjectsList受伤:

   <Route path="/" component={App}>
        <IndexRoute component={ProjectsList} />
        .....
Run Code Online (Sandbox Code Playgroud)

1. ProjectsList放入App并创建此类代理组件component={ProjectsList}

  const LayoutToogler = () => (<div></div>);
Run Code Online (Sandbox Code Playgroud)

看起来会这样:

    <Route path="/(mobile.html)" component={App}>
        <IndexRoute component={LayoutToogler} showProjects={true}/>
Run Code Online (Sandbox Code Playgroud)
  1. 在顶级应用程序组件中,只需检查此属性(showProjects)即可决定是否显示项目:

           <ProjectsList
             style={{display:this.props.children.props.route.showProjects?'block':'none'}}
                    />
    
    Run Code Online (Sandbox Code Playgroud)

不要忘记处理组件中的style属性ProjectList


deo*_*owk 3

在您的情况下,react-router按预期工作,如果您希望计时器在整个应用程序中可见,那么您需要将其视为组件而不是视图

/*global define, Backbone, React, $, Request, Router, Route, Link */

var App = React.createClass({
    render: function () {
        return (
            <div>
                <h1>App</h1>
                // this will not unmount when routes are changed
                <Timer /> 
                <ul>
                    <li><Link to="/about">About</Link></li>
                </ul>
                // this will unmount/mount when routes are changed
                {this.props.children}
            </div>
        )
    }
});

var About = React.createClass({
    render: function () {
        return <h3>Here is about page</h3>
    }
});

var Timer = React.createClass({
    getInitialState: function() {
        return {counter: 0};
    },
    render: function () {
        return (
            <div>
                <h2>Time is running over...</h2>
                <b>{this.props.interval}</b>
                <p>{this.state.counter}</p>
            </div>
        )
    },
    componentDidMount: function () {
        this.loadCommentsFromServer();
        setInterval(this.loadCommentsFromServer, 1000);
    },
    loadCommentsFromServer: function () {
        this.setState({counter: this.state.counter + 1});
    }
});

React.render((
    <Router location="history">
        <Route path="/" component={App}>
            <Route path="about" component={About} />
        </Route>
    </Router>
), document.body);
Run Code Online (Sandbox Code Playgroud)

  • 但在这种情况下,计时器将始终可见。正如我之前在我的实际项目中提到的,我有一个带有巨大网格的复杂组件。因此,每次我返回该组件时,它都会向服务器发送请求以获取数据。但我不需要这样的行为。我不明白为什么 React-Router 会销毁组件而不是仅仅隐藏它?看来我不明白使用react-router的目的:( (5认同)
  • @AlexeiBerkov 你有没有找到解决方案? (2认同)