【问题标题】:Use Stateful components in the React router在 React 路由器中使用有状态组件
【发布时间】:2019-06-27 07:08:24
【问题描述】:

想象一下带有标签的应用程序,它允许用户在用户可以输入不同信息的不同区域之间切换。

我想创建一个表示此选项卡的开关组件,并根据当前路由器状态呈现具有用户相关信息的另一个组件。主要困难在于子组件是有状态的——它们已经可以包含用户输入的一些文本。我尝试通过以下方式用简单的react-router 实现这个组件:

class Application extends React.PureComponent {
    public render(): React.ReactNode {
        const items = ["A", "B", "C"];
        return (
            <div>
                <header>
                    <ul>
                        {items.map((item, i) =>
                            (<li key={i}>
                                <Link to={"/" + item}>{item}</Link>
                            </li>))
                        }
                    </ul>
                </header>
                <SwitchComponent items={items}/>
            </div>
        );
    }
}

class SwitchComponent extends React.PureComponent<{items: string[]}> {
    public render(): React.ReactNode {
        const { items } = this.props;
        return (
            <Switch>
                {items.map((item, index) =>
                    <Route key={index} path={"/" + item} render={
                        () => (<StatefulComponent {...item}/>)
                    }/>)
                }
            </Switch>
        );
    }
}

class StatefulComponent extends React.PureComponent<{}, {text: string}> {
    public state = {
        text: "",
    };
    public onChange(text: string) {
        this.setState({text});
    }
    public render(): React.ReactNode {
        const { text } = this.state;
        return (
            <input value={text} onChange={
                (event) => this.onChange.bind(this)(event.target.value)}
            />
        );
    }
}

这里我实现了一个简单的Application 组件,其中包含通过&lt;Link&gt; 组件实现的导航区域和包含路由切换的内容区域。

此实现不会保留&lt;StatefulComponent&gt; 状态,因为每次用户切换到另一个链接时都会重新创建&lt;SwitchComponent&gt;。

在这种情况下,如何保留组件的状态?

【问题讨论】:

    标签: reactjs react-router stateful


    【解决方案1】:

    你不能。 React路由器卸载不需要的&lt;Route&gt;组件(不匹配的组件,使用react-router时只挂载一个&lt;Route&gt;组件)。

    【讨论】:

    • 是否有任何react-router 或类似组件的扩展能够保留有状态组件?
    • 从未听说过这样的事情。但是您可以只使用一个Route 来保留有状态组件,它看起来像这样:&lt;Route path={"/:item"}&gt;。在StatefulComponent 中,您可以检查props.match 以在任何给定时刻检查:item 的值。另外不要忘记更改您的渲染道具以使其传递其道具,例如:(props) =&gt; (&lt;StatefulComponent {...props} {...item}/&gt;)
    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2020-08-16
    • 2017-05-03
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多