React setState 不设置状态
React setState does not set the state
我正在做一个简单的反应应用程序,我有一个 App 组件,它跟踪状态然后呈现它。起初状态是一个空字符串。之后,当我访问 /signin 时,我单击一个按钮,将状态从 "" 更改为 "Marc" 并通过道具将其传递给 Profile 组件,该组件在其页面上呈现用户名。问题是它不会改变状态,它总是“”。我尝试调试,状态始终为“”,但实际上调用了 setState 方法。所以我不知道为什么。谁能帮我?提前致谢,我附上代码。
APP:
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>
);
}
}
在您的情况下,在 SignIn
组件上,单击按钮将正确更新状态,但是当您尝试访问另一个页面时,通过手动输入 URL 说 Profile
在浏览器中,您的状态更改将丢失,并且状态将在您的会话更改时重新初始化。
您应该改为尝试以编程方式导航,对此您可以参考 Whosebug 上的以下答案:
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>
);
}
我正在做一个简单的反应应用程序,我有一个 App 组件,它跟踪状态然后呈现它。起初状态是一个空字符串。之后,当我访问 /signin 时,我单击一个按钮,将状态从 "" 更改为 "Marc" 并通过道具将其传递给 Profile 组件,该组件在其页面上呈现用户名。问题是它不会改变状态,它总是“”。我尝试调试,状态始终为“”,但实际上调用了 setState 方法。所以我不知道为什么。谁能帮我?提前致谢,我附上代码。
APP:
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>
);
}
}
在您的情况下,在 SignIn
组件上,单击按钮将正确更新状态,但是当您尝试访问另一个页面时,通过手动输入 URL 说 Profile
在浏览器中,您的状态更改将丢失,并且状态将在您的会话更改时重新初始化。
您应该改为尝试以编程方式导航,对此您可以参考 Whosebug 上的以下答案:
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>
);
}