javascript - 状态无法访问道具
问题描述
我正在尝试通过使用from props添加selectedUserIds
状态构造函数。userListIds
但是,似乎在执行构造函数时,道具中的值尚未设置,因此我得到空值。
但是,当我this.props.userListIds
在渲染开始时打印时,它显示得很好。问题出在其他地方。解决方案可能是什么?这是代码:
const mapStateToProps = (state: State, props: OwnProps): PropsFromState => ({
userList: getCompanyTeamListSelector(state),
userListIds: state.ddls.companyUsers.map(element => Number(element.id))
});
@connect(mapStateToProps)
export default class EmailModal extends React.Component<OwnProps & Partial<PropsFromDispatch> & Partial<PropsFromState>, OwnState> {
constructor(props: OwnProps) {
super(props);
this.state = {
valueSelected: true, selectedUserIds: this.props.userListIds // HERE
}}
解决方案
Props 是 React 组件的外部数据资源,因此您应该始终假设 props 数据不可靠,并注意组件中的空/未定义的 props。
给定构造函数是在组件生命周期第一次渲染之前执行的,在构造函数执行过程中,有props.userListIds
可能是空的,并且 at render
,它被检索并准备好使用。如果你真的想存储userListIds
在本地状态,你可以使用getDerivedStateFromProps
更新本地状态:
public static getDerivedStateFromProps(nextProps: IProps, prevState: IState) {
return (nextProps.userListIds != prevState.selectedUserIds) ?
{ selectedUserIds: nextProps.userListIds } :
null
}
但与此处的其他评论一样,我也反对将 props 复制到本地状态的想法,因为对于同一条数据,您将有 2 个独立的事实来源,并且每当您的 props 更改时都需要更新本地状态。可以考虑直接props.userListIds
改用。
推荐阅读
- r - readr and write_csv: double precision numbers and grisu3
- html - 如何在带有液体变量的html中使用填充突出显示文本
- makefile - 多依赖makefile目标
- python - 使用 UPDATE 时如何防止 SQL 数据库被锁定?
- django - 自动完成 Django 表单 jQuery
- flutter - 在 null 上调用了 getter 'navigator'
- javascript - JavaScript 表单验证适用于 Chrome/Firefox 而不是 IE/Edge
- arrays - 如何在 mongodb 上执行“$all $in”?
- java - 如何解决 EJB 上的 @Stateless 注释?
- html - Css 不适用于 div 元素