开发者问题收集

React-router 传递数据

2018-10-23
2370

我在我的项目中使用 React。我也在使用 react-router-dom 库。但是,我对通过 react-router-dom 传递数据感到困惑。

这是父组件的代码:

class Parent extends Component {
    constructor(props) {
        super(props);
        this.state = {
            Path: {
                pathname: "/child/id/1",
                state: {
                    languageChosen: "English"
                }
            }
        };
        this.onChangeLanguage = this.onChangeLanguage.bind(this);
    }
    onChangeLanguage() {
        const { Path } = this.state
        Path.state.languageChosen = 'Spanish'
        this.setState({Path})

    }
    render() {
        return (
            <div>
              <NavLink to={this.state.Path}>ToChild</NavLink>
              <Route
                path={`/child/id/:id`}
                render={props => (
                  <Child {...props} onChangeLanguage={this.onChangeLanguage} />
                )}
              />
            </div>
        );
    }
}

它有一个名为 Path 的状态。父组件将函数 onChangeLanguage 传递给其子组件。

这是子组件:

class Child extends Component {
    onChange = () => {
        this.props.onChangeLanguage;
    };
    render() {
        const { languageChosen } = this.props.location.state;
        return (
             <div>
              {languageChosen === "English" ? "English" : "Spanish"}
              <button onClick={this.onChange}>Change Language</button>
            </div>
        );
    }
}

如果我单击子组件中的 Change Lanuguage 按钮,则会调用该函数并且父组件中的状态会发生变化。prop LanguageChosen 也会在子组件中更新。

但是,如果我刷新页面,按下按钮后子组件中的 prop LanguageChosen 不会更新。只有当我不刷新页面时它才有效。

我该如何解决这个问题?谢谢!

2个回答

出现此问题的原因在这里

883630842

languagechose是从this.props.location设置的,当URL更改为“/child/id/id/ :id“,在刷新页面后,在父元素中陈述,但它不会更改位置。STATE.STATE.STATE。,我认为您可以使用组件中的道具来解决问题。 1.在Route

733356396

2中设置LanguageChosen属性。在儿童组件

497456266 中更改此操作。
Root
2018-10-25

这段代码让我有点困惑,但请记住,当您刷新页面时,所有 javascript 都会重新加载,因此您在 Parent 中将 languageChosen 硬编码为 English ,因此每次刷新页面时,它都会重置为 English 。您可以将值存储在 localStorage 中并在刷新时检查其是否存在,也可以将其添加到您的路由路径 child/id/:id/:language

然后,如果您使用的是 React Router v4,请在您的子组件中使用 this.props.match.params.language ,它将呈现给定的语言。

DevDwarf
2018-10-23