曾经愚弄过一些代码,然后遇到了一些棘手的问题。当前,如果用户是经过身份验证的,我正在显示用户数据。但是,我必须把this.props.user放在?在内联语句中。否则,尽管this.props.user是?可以。
这是代码
// import React from "react";
// import { connect } from "react-redux";
// import { getUser } from "../store/actions/userActions";
// import { withRouter } from 'react-router-dom';
import React from 'react';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom'
import * as actions from '../store/actions/auth'
class UserDetailView extends React.Component {
componentDidMount(){
this.props.onTryAutoSignup()
this.props.getfetchUser(this.props.username)
console.log(this.props)
const user = this.props.user
}
render(){
return(
<div>
{
this.props.user//need this or the below become undefined && this.props.isAuthenticated ?
<div>
Welcome {this.props.user.username} {this.props.user.email}
</div>
:
<div><Link to='/login/'>Login</Link></div>
}
</div>
)
}
}
const mapStateToProps = state => {
return{
isAuthenticated: state.token !== null,
user: state.user,
username: state.username
}
}
const mapStateToDispatch = (dispatch) => ({
logout: () => dispatch(actions.logout()),
onTryAutoSignup: () => dispatch(actions.authCheckState()),
getfetchUser: id => dispatch( actions.fetchUser( id ) )
})
export default connect(mapStateToProps, mapStateToDispatch)(UserDetailView);
答案 0 :(得分:0)
这仅仅是因为在组件的“首次加载”中,用户数据无效(我想,我看不到您的reducer)
因此,假设您的reducer将默认用户设置为null
componentDidMount
调度并呼叫getfetchUser
getfetchUser
将需要一些时间... render
不在等待中,因此它将调用render
方法user
,因为您没有从服务器获得响应user
为空所以这就是为什么您看到此“怪异”行为的原因,但这就是当前实现中的情况。
您可以尝试各种技巧来确保自己状态良好,例如:
坚持所做的事情
添加一个loading
标志,因此您可以知道自己正在等待服务器的响应。这是更好的选择,因为您可以处理服务器中的错误。
答案 1 :(得分:0)
您需要检查,因为您正在访问用户对象的用户名和电子邮件属性。
假设是初始渲染,
user = {} // this wont have properties initially
isAuthenticated = true
您尝试访问当时不存在的电子邮件和用户名。
为避免这种情况,
也许您可以在用户对象本身内部传递isAuthenticated。这样可以保持完整性。