0

TLDR;即使 this.props 的属性丢失,我也需要能够在 React 中渲染子组件。

我有一个使用Yahoo 的 Flxubile构建的 React 应用程序。该应用程序使用 WP REST API 从 Wordpress 站点获取数据。有时可能会丢失图像或 API 中的其他内容,这会导致客户端中断。这是一个例子:

我有一个名为 Articles.js 的文件,它连接到保存我的文章的 ArticlesStore。然后,我为我拥有的每篇文章渲染一个 Article.js,并像这样传递道具:

{   this.props.articles.map(function(el, index) {                                           
      return <Article key={index} article={el} />
    })
}

这里一切正常,但是在我的 Article.js 中,当我尝试访问未设置的属性时,我得到以下信息:

未捕获的类型错误:无法读取未定义的属性“大小”

这是导致错误的行:

<img src={this.props.article.meta_fields.image.sizes.large} />

当文章中缺少图像时会发生这种情况。我当然理解 javascript 错误,但如果 API/Store 中缺少图像 url,我想呈现 Article.js 组件事件。我尝试了以下解决方案,但它会导致太多混乱且无法控制:

  1. 如果我们有 prop 即 {this.props.article.meta_fields.image ? this.props.article.meta_fields.image.sizes.large :“imagemissing.png”}
  2. 设置默认属性。这不起作用,因为从父级传递到子级的属性会覆盖 defaultProps。

也许除了将道具从父母传给孩子之外,我应该尝试其他方法?有一个 ArticleStore,我可以在其中为每篇文章设置默认值吗?你会怎么做?

4

1 回答 1

2

如果您想提供嵌套结构作为道具(与 一样article),您将希望能够依赖始终几乎相同的结构。在这种情况下它不会,有时meta_fields没有-image属性(正如你的 TypeError 所暗示的那样)。

在您的情况下,我会考虑Article从文章对象中提取您在组件中实际需要/使用的东西,并将它们作为道具传递。

假设您Article只使用title,bodyimage。然后将它们作为道具传递。

<Article title={ article.title } body={ article.body } image={ getImage(article) }/>

function getImage(article) {
    if (article.meta_fields.image
     && article.meta_fields.image.sizes
     && article.meta_fields.image.sizes.large
    ) {
        return article.meta_fields.image.sizes.large;
    }
    return 'default_image.jpg'; // Or whatever you want.
}

有人可能会认为额外的道具在这里构成了更多的“混乱”,但考虑到 clutter 和 之间的选择TypeError,我选择了 clutter。

如果你不想重新发明轮子。像这样在嵌套结构中访问数据的问题之前已经解决了。

// Lodash
_.get(article, 'meta_fields.image.sizes.large', 'default_image.jpg')
// Ramda
_.pathOr('default_image.jpg', ['meta_fields', 'image', 'sizes', 'large'], article)
于 2017-04-25T10:35:30.247 回答