Javascript 国家可以';t通道道具

Javascript 国家可以';t通道道具,javascript,reactjs,Javascript,Reactjs,我正试图使用props中的userListIds在状态构造函数中添加selectedUserId。然而,在执行构造函数时,似乎还没有设置props中的值,因此我得到了null 但是,当我在渲染开始时打印this.props.userListIds时,它显示的很好。问题出在别的地方。解决办法可能是什么?代码如下: const mapStateToProps = (state: State, props: OwnProps): PropsFromState => ({ userL

我正试图使用props中的
userListIds
在状态构造函数中添加
selectedUserId
。然而,在执行构造函数时,似乎还没有设置props中的值,因此我得到了null

但是,当我在渲染开始时打印
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
    }}
const-mapStateToProps=(state:state,props:OwnProps):PropsFromState=>({
userList:GetCompanyTestListSelector(状态),
userListIds:state.ddls.companyUsers.map(element=>Number(element.id))
});
@连接(MapStateTops)
导出默认类EmailModal扩展React.Component{
构造器(道具:OwnProps){
超级(道具);
此.state={
valueSelected:true,SelectedUserId:this.props.UserListId//此处
}}

您的React错误。如果可以在道具中访问该值,则该值应保留在道具中。在道具和状态之间复制数据可能会导致无用的组件重新呈现,最重要的是会导致许多错误,特别是在插入诸如React Redux之类的库时,这些库将广泛操作道具


哦,在构造函数中使用
props
,而不是
这个。props

你做得不对。如果可以在props中访问该值,则该值应该保留在props中。在props和状态之间复制数据可能会导致无用的组件重新呈现,最重要的是会导致许多错误,尤其是在插入l时像React Redux这样的图书馆将广泛地操纵道具


哦,在构造函数中使用
props
,而不是
这个。props

props是React组件的外部数据资源,因此您应该始终假设props数据不可靠,并注意组件中的空/未定义的props

如果构造函数在组件生命周期的第一次呈现之前执行,那么在构造函数的执行过程中,
props.userListIds
可能为空,并且在
render
处,可以检索并准备使用它。如果您真的想在本地状态下存储
userListIds
,可以使用
getDerivedStateFromProps
要更新本地状态:

public static getDerivedStateFromProps(nextProps: IProps, prevState: IState) {
  return (nextProps.userListIds != prevState.selectedUserIds) ? 
    { selectedUserIds: nextProps.userListIds } :
    null
}

但是,和这里的其他评论一样,我也反对把道具复制到本地状态的想法,因为你将有2个分开的数据源用于同一段数据,当你的道具发生变化时,需要更新本地状态。你可以直接考虑使用<代码>道具。UsListIDS < /C> >。

< P>道具是反应的外部数据资源。组件,所以您应该始终假设道具数据不可靠,并注意组件中的空/未定义道具

如果构造函数在组件生命周期的第一次呈现之前执行,那么在构造函数的执行过程中,
props.userListIds
可能为空,并且在
render
处,可以检索并准备使用它。如果您真的想在本地状态下存储
userListIds
,可以使用
getDerivedStateFromProps
要更新本地状态:

public static getDerivedStateFromProps(nextProps: IProps, prevState: IState) {
  return (nextProps.userListIds != prevState.selectedUserIds) ? 
    { selectedUserIds: nextProps.userListIds } :
    null
}

但是,和这里的其他评论一样,我也反对把道具复制到本地状态的想法,因为你将有2个分开的数据源用于同一段数据,当你的道具发生变化时,需要更新本地状态。你可以直接考虑使用<代码>道具。UsListIDS < /C> >。< /P>在构造函数中只使用<代码>道具< /代码>。,而不是

this.props
只需在构造函数中使用
props
,而不是
this.props
props是不可变的,我需要这个值是动态的。谢谢,我将尝试这个方法OK,因为它现在是两个不同的变量,不需要同步。从一个prop初始化某些状态是完全合理的value@MatthewHerbst在查看代码时,似乎
userListIds
在状态和道具中需要相同,OP后来将其澄清为错误,但我关于复制数据的评论仍然存在(不过,初始化数据确实是完全合理的)问题是UserListId处于PropsFromState而不是OwnProps中,因此我无法使用props.UserListId。我尝试了一些解决方案,但没有任何效果。对于这个解决方案,什么是正确的解决方案?props是不可变的,我需要此值是动态的。谢谢,我将尝试此选项OK,这很有效,因为它现在是两个不同的变量,不需要更改同步从道具初始化某些状态是完全合理的value@MatthewHerbst查看代码,似乎
userListIds
在状态和道具中需要相同,OP后来澄清为错误,但我关于复制数据的评论仍然存在(然而,初始化数据确实是完全合理的)问题是UserListId处于PropsFromState而不是OwnProps中,因此我无法使用props.UserListId。我尝试了一些解决方案,但没有任何效果。这一个的正确解决方案是什么?感谢您的回答,但是getDerivedStateFromProps也不起作用。感谢您的回答,但是getDerivedStateFromProps也不起作用。