【发布时间】:2018-10-01 06:49:39
【问题描述】:
我已在父级中声明状态以确定用户是否已登录,如下所示
class App extends Component {
constructor(props) {
super(props)
this.state = {
isLoggedIn: false
}
}
render() {
<div>
{
(document.cookie && this.state.isLoggedIn) ? (
<LoggedInHeader/>
) : <HomeHeader/>
}
为了让用户登录,我向 api 发出 axios 请求,该请求又给了我一个存储在浏览器 cookie 中的令牌,下面的代码来自我的登录模式组件,我明确更新了将 axios 请求设置为 true 后的状态,控制台中的状态会按我的预期更新,但是当我检查布尔值是 true 还是 false 时,它处于原始状态。我知道“setState() 不会立即改变 this.state”,但似乎仍然无法改变状态。下面的登录表单组件是应用父级的子级。
loginSubmitHandler = (event) => {
event.preventDefault()
const user = "email=" + this.state.email + '&password=' + this.state.password
const instance = axios.create({
baseURL: 'http://weburl',
timeout: 1000,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
instance.post('/login', user)
.then(res => {
let d = new Date
d.setDate(d.getDate() + 30)
let expires = "expires=" + d
document.cookie = "sessionname" + "=" + res.data.success.token + expires + ";path=/"
console.log('changing state')
this.setState({
isLoggedIn: true
}, () => {console.log('New state', this.state)})
})
.catch(err => {
console.log(err, "There was an error")
})}
【问题讨论】:
-
您正在 App 组件中存储
isLoggedIn状态。因此,登录后,您必须更新该状态。相反,您在子组件LoginForm中设置状态。尝试通过将函数作为道具传递给 LoginForm 来更新父状态 -
状态不传递给子组件吗?如果是这样,我需要更改它,以便在 App 组件中调用该函数并在那里设置状态,因为那是我控制布局的地方?
-
不,每个组件都有自己的状态。你所做的是正确的。不要对 App 进行 api 调用。在 loginForm 本身中执行此操作并使用作为 prop 传递的函数更新父级中的状态。
-
太棒了,感谢您对函数本身的过度思考,仍然掌握了道具和状态
标签: javascript reactjs cookies state axios