【问题标题】:React setState does not set the stateReact setState 不设置状态
【发布时间】:2017-07-18 08:54:26
【问题描述】:

我正在做一个简单的反应应用程序,我有一个 App 组件,它跟踪状态然后呈现它。起初状态是一个空字符串。之后,当我访问 /signin 时,我单击一个将状态从“”更改为“Marc”的按钮,并通过道具将其传递给在其页面上呈现用户名称的 Profile 组件。问题是它不会改变状态,它总是“”。我尝试调试,状态始终为“”,但实际上调用了 setState 方法。所以我不知道为什么。谁能帮我?提前致谢,附上代码。

应用程序:

export default class App extends React.Component {

    constructor(props) {
        super(props);
            this.state = {
            session: ""
        };
        this.updateUser = this.updateUser.bind(this);
    }

    updateUser() {
        this.setState({
            session: "Marc"
        });
    }

render() {
    return(
        <BrowserRouter>
            <Switch>
                <Route path exact='/' component={Home}/>
                <Route path='/profile' render={(props) => (
                    <Profile session={this.state.session} /> 
                )}/>                                            
                <Route path='/signin' render={(props) => (
                    <SignIn onClick={this.updateUser} />
                )}/> 
            </Switch>    
        </BrowserRouter>
    );
}

}

登录:

export default class SignIn extends React.Component{

constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
}


responseGoogle (googleUser) {
    const mail = googleUser.profileObj.email;
    const familyName = googleUser.profileObj.familyName;
    const name = googleUser.profileObj.name;
    //this.changeName(mail);
    alert("Mail: " + mail + "\n" + "Nom i Cognoms: " + name + "\nSuccessfully Logged In");
}

handleClick() {
    this.props.onClick();
}

render () {
    return (
    <div>
        <GoogleLogin 
                    clientId="CLIENTID"
                    onSuccess={this.responseGoogle}
                    onFailure={this.responseGoogle}
                    buttonText="Google"/>
        <button onClick={this.handleClick}>Instant User</button>            
    </div>
    );
}

}

简介:

export default class Profile extends React.Component {

constructor(props) {
    super(props)
}


render() {
    return(
        <h1>I am {this.props.session} User</h1>
    );
}
}

【问题讨论】:

  • Profile 组件仅在您更改路线时才会显示道具,我没有看到您更改。你也看到控制台中的一些错误
  • 不,我在控制台中看不到任何错误。那么,如果我希望个人资料页面在单击登录页面上的按钮时更改用户,我该怎么办?
  • 但我只想改变 App 父级的状态。然后如果我去 /profile 只看到更新。不可能吗?
  • 是的,只要您通过链接导航并且不使用配置文件 url 刷新页面,因为本地状态更改丢失,它应该可以工作

标签: reactjs react-native react-router react-redux setstate


【解决方案1】:

在您的情况下,当您在 SignIn 组件时,单击按钮将正确更新状态,但是当您尝试通过在浏览器中手动输入 URL 来访问另一个页面说 Profile 时,您的状态更改将丢失并且当您的会话发生变化时,状态将重新初始化。

您应该尝试以编程方式导航,为此您可以参考 StackOverflow 上的以下答案:

Programatically Routing based on a condition with react-router

简而言之,您将拥有登录组件

class SignIn extends React.Component {
     ...
    handleClick() {
        this.props.onClick();
        this.props.history.push('/profile');
    }
    ...
export default withRouter(SignIn);

以上是我建议你做的,或者为了测试你可以有一个Link 组件并使用它导航

render() {
    return(
        <BrowserRouter>

            <div>
            <Link to="/profile">Profile</Link>
            <Switch>
                <Route path exact='/' component={Home}/>
                <Route path='/profile' render={(props) => (
                    <Profile session={this.state.session} /> 
                )}/>                                            
                <Route path='/signin' render={(props) => (
                    <SignIn onClick={this.updateUser} />
                )}/> 
            </Switch>  
            </div>  
        </BrowserRouter>
    );
}

【讨论】:

  • 非常感谢!但是为什么要用Router(SignIn)导出呢?
  • 当你想使用路由道具,比如历史,你需要用 withRouter 包装你的组件,因此我有这个声明
  • 完美!就我而言,如果我想做同样的事情,但不是硬编码名称,而是从 Google 登录中获取?因为我的问题是,在 SignIn 上的 responseGoogle 方法中,我无法访问 this.dosomething,因为这是 google 回调的实例,而不是 SignIn 类的实例。
  • 根据 Google 响应设置登录状态,然后在设置父状态时将该名称发送给父级
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 2020-01-15
  • 2019-07-31
  • 2019-07-26
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多