开发者问题收集

为什么传递给组件的数据会导致 TypeError:未定义错误?显示在 React 开发工具中

2017-10-16
250

我通过 mapStateToProps 将状态数据传递给 props,但组件无法识别。

// user_show_container
// propper import statements....
const mapStateToProps = state => ({
  ids: state.entities.users.usersById.leagueIds;
});

const mapDispatchToProps = dispatch => ({
  requestTargetUserData: id => dispatch(requestTargetUserData(id)),
});

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(UserShow);

操作在 'componentWillMount()' 中调用,props 应该可用

class UserShow extends React.Component {
  constructor(props) {
    super(props);
  }

  componentWillMount() {
    this.props.requestTargetUserData(this.props.match.params.userId)
  }

  render() {
    const { ids } = this.props; // [1, 2, 3]

    return (
      <div className="">
        <ul>
          {ids.map(id => <li>id</li>)} // causes error
        </ul>
      </div>
    )
  }
}

export default UserShow;

当我删除 map 函数并且不使用 props 中的数据进行渲染时,Redux 开发工具显示 'id' 数组可供组件使用。
enter image description here

通过 props 传递的所有内容都不会发生这种情况。例如,将其交换出去即可。用户名已呈现到页面。

...
   return (
      <div className="">
        <h1>{targetUser.username}</h1>
      </div>
    )
  }
}

export default UserShow;

我真的很困惑,所以任何指导都将不胜感激。感觉我错过了一些基本的东西,但我找不到任何答案。

感谢您的时间。

2个回答

问题在于初始化:

您应该使用 [] 初始化:

state.entities.users.usersById.leagueIds , 首次使用时以及值不可用时也应如此。


在这种情况下, state.entities.users.usersById.leagueIds 将未定义,这是您收到错误的唯一原因

Cannot read property of 'map' of undefined


如果您不想初始化,也可以这样做:

const ids = this.props.ids ? this.props.ids : [];

或者按照@MayankShukla 在评论中建议的更短形式:

const ids = this.props.ids || [];
Vivek Doshi
2017-10-16

这个 state.entities.users.usersById.leagueIds 返回的是一个数组吗?因为如果它返回了未定义,那也可能是错误的原因。

const mappStateToProps = state => ({
   ids: ["1", "2", "3"]
});

尝试设置上述内容,看看是否仍然看到错误。如果错误消失,那么是否意味着您的 ids 信息是在组件呈现后填充的?

Nandu Kalidindi
2017-10-16