所以我有两个简单的React类
仪表板(父级)
class UserDashboardPage extends Component {
render() {
console.log("UserDashboardPage")
console.log(this.props.users)
return (
<div>
<UserInfoComponent user={this.props.users} />
</div>
);
}
}
// map Users from store to Props
function mapStateToProps({ users }) {
return { users };
}
UserInfoComponent(child)
export class UserInfoComponent extends Component {
render() {
console.log("UserInfoComponent")
console.log(this.props.user)
return (
<h2>{this.props.user.firstName}</h2>
);
}
}
我遇到的问题是我想在UserInfoComponent中打印this.props.user.firstName
,但该值最初为null,然后当值获取数据时,组件不会重新呈现。
userReducers
const initialState = { data: [], user: null };
const UserReducer = (state = initialState, action) => {
switch (action.type) {
case ADD_USER :
return {
data: [action.user, ...state.data],
};
case UPDATE_USER :
return {
user: action.user,
};
case LOGIN_USER: {
const user = (action.response.statusCode === 200) ? action.response.user : null;
console.log(user);
return {
user,
};
}
default:
return state;
}
};
答案 0 :(得分:1)
在reducer中只需将const initialState = { data: [], user: null }
更改为const initialState = { data: [], user: {} };
通过使用户的初始状态为空对象,可以避免this.props.user['property']
导致无法读取未定义错误属性的任何问题。
此外,如果最初用户是空对象,则应该显示其他内容。如果您正在执行AJAX请求以获取用户信息,那么请考虑可能正在执行加载组件。您只需要向reducer添加一个新状态,如下所示:
const initialState = { data: [], user: {}, loading: true };
然后一旦你收到用户信息,假设来自登录用户,你可以将reducer设置为loading: false
,你应该使用Object.assign或...
运算符来避免变异原始状态。见http://redux.js.org/docs/recipes/UsingObjectSpreadOperator.html。更新,以便您的减速器看起来像这样
const UserReducer = (state = initialState, action) => {
switch (action.type) {
case ADD_USER :
return {
...state,
data: [action.user, ...state.data],
};
case UPDATE_USER :
return {
...state,
user: action.user,
};
case LOGIN_USER: {
const user = (action.response.statusCode === 200) ? action.response.user : null;
console.log(user);
return {
...state,
user,
loading: false
};
}
default:
return state;
}
};
然后在您的UserDashboard组件中
class UserDashboardPage extends Component {
render() {
console.log("UserDashboardPage")
console.log(this.props.users)
const content = this.props.loading ? '....loading' : <UserInfoComponent user={this.props.users} />;
return (
<div>
{content}
</div>
);
}
}
这将确保它显示加载,然后一旦用户加载它将显示用户信息。
答案 1 :(得分:0)
是否有可能为UserInfoComponent
属性中的每个条目呈现一个users
。
如果users
是您可能想要做的user
个对象数组
{ users.map((user) => (<UserInfoComponent user={user} />) }
否则,要么提供一个空对象作为users
的默认值(使用defaultProps
),要么检查users
函数中是否存在mapStateToProps
值。< / p>