将异步获取的数据传递给子 props

2024-03-17

我正在制作一个应用程序,它从远程源获取一系列新闻项目并将其显示在页面上。

我有端点,并且可以使用控制台日志证明可以进行成功的调用$.getJSON()。我将此调用放入父组件中,因为子组件需要使用数据。

但是,当我将此数据传递给子组件时,会出现控制台错误:

Uncaught TypeError: Cannot read property 'headline' of undefined

这是因为 React 甚至在数据传递到组件之前就尝试渲染组件。这让我觉得我应该首先在其他地方调用我的ajaxcomponentDidMount.

为了解决这个问题,我在子组件上设置了一个方法,如果存在 prop,则返回标题:

getHeadline: function () {
    if(this.props.newsItems){
        return this.props.newsItems.headline
    } else {
        return null
    }
},

这感觉有点令人讨厌。有没有更好的方法,或者我在代码中遗漏了某些内容?

var BigStory = React.createClass({

    getHeadline: function () {
        if(this.props.newsItems){
            return this.props.newsItems.headline
        } else {
            return null
        }
    },

    render: function () {
        console.log('props:', this.props);
        console.log('newsItems:', this.props.newsItems);
        return (
            <div className="big-story col-xs-12">
                <div className="col-sm-5">
                    <h1>{this.getHeadline()}</h1>
                    <p>Placeholder text here for now.</p>
                    <p>time | link</p>
                </div>
                <div className="col-sm-7">
                    <img src="http://placehold.it/320x220" alt=""/>
                </div>
            </div>
        );
    }
});

var Main = React.createClass({

    getInitialState: function () {
        return {
            newsItems: []
        }
    },

    componentDidMount: function () {
        this.getNewsItems();
    },

    getNewsItems: function () {
        $.getJSON('http://www.freecodecamp.com/news/hot', (data) => {
            console.log('data sample:', data[0]);
            this.setState({newsItems: data})
        })
    },

    render: function () {
        return (
            <div className="container">
                <div className="main-content col-sm-12">
                    <div className="left-sided-lg-top-otherwise col-lg-8 col-md-12 col-sm-12 col-xs-12">
                        <BigStory newsItems={this.state.newsItems[0]}/>
                    </div>
                </div>
            </div>
        );
    }
});

我建议让家长决定当它处于“加载”状态并离开时要做什么BigStory作为一个“哑”组件,它总是呈现相同的内容,假设它总是收到一个有效的newsItem.

在这个例子中,我展示了一个<LoadingComponent />,但这可以是您需要的任何内容。这个概念是BigStory不必担心“接收无效数据”的边缘情况。

var Main = React.createClass({
  // ...
  render() {
    const {newsItems} = this.state;
    // You could do this, pass down `loading` explicitly, or maintain in state
    const loading = newsItems.length === 0;
    return (
      <div className="container">
          <div className="main-content col-sm-12">
              <div className="left-sided-lg-top-otherwise col-lg-8 col-md-12 col-sm-12 col-xs-12">
                  {loading 
                    ? <LoadingComponent />
                    : <BigStory newsItem={newsItems[0]} />  
                  }
              </div>
          </div>
      </div>
    );
  }
});

function BigStory(props) {
  // Render as usual. This will only be used/rendered w/ a valid
  return (
    <div className="big-story col-xs-12">
      <h1>{props.headline}</h1>
      {/* ... */}
    </div>
  )
}

另一种解决方案(尽管我推荐一种更像上面的方法)是始终使用BigStory以相同的方式组件,但在没有加载故事时为其提供一个“占位符故事”。

const placeholderNewsItem = {
  headline: 'Loading...',
  /* ... */
};

var Main = React.createClass({
  // ...
  render() {
    const {newsItems} = this.state;
    // Conditionally pass BigStory a "placeholder" news item (i.e. with headline = 'Loading...')
    const newsItem = newsItems.length === 0
      ? placeholderNewsItem
      : newsItems[0];
    return (
      <div className="container">
          <div className="main-content col-sm-12">
              <div className="left-sided-lg-top-otherwise col-lg-8 col-md-12 col-sm-12 col-xs-12">
                  <BigStory newsItem={newsItem} />
              </div>
          </div>
      </div>
    );
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将异步获取的数据传递给子 props 的相关文章

随机推荐

  • API网关自定义域证书错误

    我正在尝试使用自定义域设置区域 API 网关 但遇到了涉及 SSL 证书的问题 这是我所做的 使用 ACM 为vitalservices 3 docriot com 创建了证书 在API网关中 创建一个区域自定义域名 vitalservic
  • 传递到 ViewDataDictionary 的模型项的类型为 X[],但此 ViewDataDictionary 实例需要类型为 X 的模型项[重复]

    这个问题在这里已经有答案了 Error InvalidOperationException 传递到 ViewDataDictionary 的模型项的类型为 Test Models Ticket 但此 ViewDataDictionary 实
  • 即使没有从 HTML 到 PHP 检查,如何获取所有复选框变量?

    我注意到 PHP 似乎只返回选中复选框的值 我想查看复选框列表 而不仅仅是选中复选框的值 有没有办法检测未选中框的变量 我问这个问题是因为我希望能够更新设置 例如 我有一些已选中的选项 但如果用户决定取消选中某个选项 我需要知道该未选中的值
  • 使用 pyinstaller 创建可执行文件时出现分段错误:11

    最近 我创建了一个简单的 python 应用程序 其 GUI 是通过PyQt5图书馆 我已经多次测试了应用程序本身 一切正常 但是 在我尝试使用以下命令将其打包为可执行文件之后pyinstaller 运行生成的可执行文件不会创建 GUI 而
  • 有没有办法获取jQuery ajax上传进度?

    ajax xhr function var xhr new window XMLHttpRequest Upload progress xhr upload addEventListener progress function evt if
  • 如何向此自定义的facet_wrap 添加geom_quantile 图例?

    我最近得到了很大的帮助 https stackoverflow com questions 60655019 why does strip text color from facet wrap not correspond to eleme
  • Mono TLS1.2 问题 - btls-cert-sync“找不到命令”

    Summary 我的公司使用 TargetProcess TP 来跟踪开放项目的进度 并且我们创建了相对较小的代码来将更新导入到 TargetProcess 目前 在提交构建后 我们启动了一个预装了 Mono 的 debian docker
  • 找不到 gradle 3.0.0-alpha4

    几天前 我安装了 android studio 3 0 预览版 之后在稳定版本 studio 2 3 3 中 当我尝试导入项目时 它给了我一个错误 在预览中一切正常 这是一个错误 Error Could not find com andro
  • 访问 CriteriaBuilder 中的 REGEXP_LIKE 函数

    我有一个多标准表单 并使用 CriteriaBuilder 来构建 sql 对于本地联系人条件 我需要使用 regexp like 函数来搜索逗号分隔数字字符串中的数字字符串 即在字符串中搜索 234 例如 1234 2345 6789 2
  • 如何使用 ggplot2 设置图例 alpha

    我有一张风速与方向的图表 其中有大量的点 因此除了 color month 之外 我还使用 alpha I 1 20 这是代码示例 library RMySQL library ggplot2 con lt dbConnect wind l
  • Jersey,如何 POST JSON 对象列表?

    我正在使用 Jersey 1 11 在 Java 中构建 RESTful Web 服务 并且在实现使用 JSON 化实体列表的方法时遇到问题 单实例方法工作正常 我得到的错误是 Status 400 Bad Request The requ
  • Android 中的 PEM 到 PublicKey

    我见过很多类似的问题 但没有一个对我有用 我只是想将从服务器检索到的 PEM 格式的 RSA 公钥转换为PublicKey在安卓中 有人能指出我正确的方向吗 编辑 我已成功使用以下代码将 PEM 转换为 PublicKey 但在对消息进行编
  • .csproj 的平台特定 ItemGroup 适用于程序集引用,但不适用于内容包含?

    由于我们有三个显式 x86 和 x64 版本的程序集 因此我编辑了相应的 csproj 文件以使用 例如 如下所示的块
  • 在 OpenGL-ES 2.0 中渲染多个 2D 图像

    我是 OpenGL 新手 正在尝试学习 ES 2 0 首先 我正在开发一款纸牌游戏 需要渲染多个纸牌图像 我跟着这个http www learnopengles com android lesson four introducing bas
  • Redux 框架在插件中使用时不工作

    我将使用 redux 框架作为我的插件选项 它显示在管理面板中 我可以保存设置 我使用了选项面板的示例配置文件 所以问题是我没有通过打印全局来获取选项值opt name多变的 如果我将 redux 框架配置文件添加到主题functions
  • CSS/HTML:在输入字段周围创建发光边框

    我想为我的表单创建一些像样的输入 并且我真的很想知道 TWITTER 如何在输入周围制作发光边框 Twitter 边框示例 图片 我也不太知道如何创建圆角 干得好 glowing border border 2px solid dadada
  • Eclipse:如何有选择地禁用某些注释中的拼写检查

    我使用的是 Eclipse Kepler 版本 如何禁用评论内的拼写检查 我确实看到 窗口 首选项 常规 编辑器 文本编辑器 拼写 但此表没有关于禁用注释内拼写检查的选项 理想情况下 我想禁用特定评论的拼写检查 在其他地方 拼写检查注释可能
  • 如何在 pygame 中进行二段跳?

    有人可以帮我调试我的代码吗 因为我不明白为什么我不能让我的角色用多个空格键进行双跳 当我运行脚本时 我可以向上 向下 向左 向右移动 但是一旦我按一次空格键 对象就会飞出窗口 问题出在这个 if 语句上 所以我猜测这个 if 语句会继续运行
  • 绑定 UserControl 依赖属性和 MVVM

    我有一个包含 UserControl 的 MainWindow 两者都以 MVVM 模式实现 MainWindowVM 具有我想要绑定到 UserControl1VM 中的属性的属性 但这行不通 这是一些代码 视图模型使用某种 mvvm 框
  • 将异步获取的数据传递给子 props

    我正在制作一个应用程序 它从远程源获取一系列新闻项目并将其显示在页面上 我有端点 并且可以使用控制台日志证明可以进行成功的调用 getJSON 我将此调用放入父组件中 因为子组件需要使用数据 但是 当我将此数据传递给子组件时 会出现控制台错