【问题标题】:Nested data access in React.jsReact.js 中的嵌套数据访问
【发布时间】:2017-07-03 18:09:10
【问题描述】:

我有一个包含图像列表的视频列表。我想更改悬停时的图像。我创建了一个 activeImgSrcId 来跟踪活动图像。 video.imgList 有一个图像列表。 video.imgList[video.activeImgSrcId] 在我放置调试点时获取所需的 url。但是删除调试点后,我看到了

Cannot read property 'undefined' of undefined 

这是我的渲染方法

renderVideoList() {
    return this.props.videoLibrary.map(video => (
      <div className="col-md-4" key={video.id}>
        <Link to={`videos/${video.id}`}>
          <img
            src={video.imgList[video.activeImgSrcId]} 
          />
        </Link>
      </div>
      ));
  }

有人可以告诉我我做错了什么吗?访问这种嵌套结构的正确方法是什么?

【问题讨论】:

  • 打印this.props的结果是什么?
  • 只在this.props.videoLibrary &amp;&amp; (this.props.videoLibrary.length === true) 时才调用renderVideoList() 怎么样?此外,如果没有定义视频的所有必需属性,您可以在内联函数中返回 null

标签: arrays reactjs nested ecmascript-6 redux


【解决方案1】:

这可能是您的 prop videoLibrary 在渲染时可能为空的问题。 如果从服务器异步获取数据并且当数据可用时将更新后的 props 传递给您的组件,则最好使用空数组初始化 videoLibrary

renderVideoList() {
    return (this.props.videoLibrary||[]).map(video => (
      <div className="col-md-4" key={video.id}>
        <Link to={`videos/${video.id}`}>
          <img
            src={video.imgList[video.activeImgSrcId]} 
          />
        </Link>
      </div>
      ));
  }

【讨论】:

  • @havenchyk 我也提供了替代选项。顺便说一句,如果数组为空,您认为 map 会被执行吗?
  • 对不起,我打算在另一篇文章中添加评论:D
  • @havenchyk 没问题 :)
  • @WitVault 我尝试了所有三种解决方案。他们都没有工作。如果我添加 src={video.activeImgSrcId} 我不会收到错误消息。我们可以在 react 中访问像 video.imgList[video.activeImgSrcId] 这样的数组吗?
  • @WitVault 我发现了这个问题。在某些数据中 video.activeImgSrcId 不存在。因此它正在破裂。谢谢!
【解决方案2】:

正如 @WItVault 已经发布的那样,videoLibrary 可以为 null 甚至未定义。所以你需要为它添加一个检查

renderVideoList() {
  const videoLibrary = this.props.videoLibrary

  if (!videoLibrary) return

  return videoLibrary.map(video => (
    <div className="col-md-4" key={video.id}>
      <Link to={`videos/${video.id}`}>
        <img
          src={video.imgList[video.activeImgSrcId]} 
        />
      </Link>
    </div>
  ));
}

我更喜欢提前返回,你不需要在空数组上运行map。 如果你对函数中的多个返回语句没问题,你可以使用这种方法。

【讨论】:

  • 我尝试了所有三种解决方案。他们都没有工作。如果我添加 src={video.activeImgSrcId} 我不会收到错误消息。我们可以在 react 中访问像 video.imgList[video.activeImgSrcId] 这样的数组吗?
【解决方案3】:

这可能是因为 videoLibrary 属性在初始渲染中不可用,因此您应该检查一下。在map 函数之前检查可以像下面这样简单

renderVideoList() {
    return  this.props.videoLibrary && this.props.videoLibrary.map(video => (
      <div className="col-md-4" key={video.id}>
        <Link to={`videos/${video.id}`}>
          <img
            src={video.imgList[video.activeImgSrcId]} 
          />
        </Link>
      </div>
      ));
  }

【讨论】:

  • 你是第三个,请在发布之前阅读其他答案
  • @havenchyk 是同样的建议,但方法不同
  • @ShubhamKhatri 我尝试了所有三种解决方案。他们都没有工作。如果我添加 src={video.activeImgSrcId} 我不会收到错误消息。我们可以在 react 中访问像 video.imgList[video.activeImgSrcId] 这样的数组吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2020-08-28
  • 2017-03-18
相关资源
最近更新 更多