javascript - 数据准备好后如何渲染组件?

标签 javascript reactjs promise

我正在尝试弄清楚如何在数据准备好时填充/呈现组件?本质上,我有一个脚本可以查询返回数据的服务器,然后解析它并将其放入具有我需要的属性的集合中。然后在另一个文件中,我有正在寻找该对象的 react 组件,但它们同时运行,因此当组件正在寻找它时该对象不存在。

我不确定如何进行。

这是我的组件:

let SliderTabs = React.createClass({
    getInitialState: function() {
        return { items: [] }
    },
    render: function() {
        let listItems = this.props.items.map(function(item) {
            return (
                <li key={item.title}>
                    <a href="#panel1">{item.title}</a>
                </li>
            );
        });

    return (
            <div className="something">
                <h3>Some content</h3>
                    <ul>
                        {listItems}
                    </ul>
            </div>
        );
    }
});

ReactDOM.render(<SliderTabs items={home.data.slider} />,                
    document.getElementById('slider-tabs'));

我如何获取数据:

var home = home || {};

home = {
  data: {
    slider: [],
    nav: []
  },
  get: function() {

    var getListPromises = [];

    $.each(home.lists, function(index, list) {
      getListPromises[index] = $().SPServices.SPGetListItemsJson({
        listName: home.lists[index].name,
        CAMLViewFields: home.lists[index].view,
        mappingOverrides: home.lists[index].mapping
      })
      getListPromises[index].list = home.lists[index].name;
    })

    $.when.apply($, getListPromises).done(function() {
      home.notice('Retrieved items')
      home.process(getListPromises);
    })
  },
  process: function(promiseArr) {
    var dfd = jQuery.Deferred();

    $.map(promiseArr, function(promise) {
      promise.then(function() {
        var data = this.data;
        var list = promise.list;

        // IF navigation ELSE slider
        if (list != home.lists[0].name) {
          $.map(data, function(item) {
            home.data.nav.push({
              title: item.title,
              section: item.section,
              tab: item.tab,
              url: item.url.split(",")[0],
              path: item.path.split("#")[1].split("_")[0]
            })
          })
        } else {
          $.map(data, function(item) {
            home.data.slider.push({
              title: item.title,
              url: item.url.split(",")[0],
              path: item.path.split("#")[1]
            })
          })
        }
      })
    })

    console.log(JSON.stringify(home.data))
    dfd.resolve();
    return dfd.promise();
  }
}

$(function() {
  home.get()
})

最佳答案

在 React 中执行此操作的一种常见方法是跟踪何时获取数据。这可以做到,例如通过在您的状态中使用 isFetching 字段:

// This would be your default state
this.state = {
  isFetching: false
};

然后,当您触发请求时(最好在 componentDidMount 中),您可以使用以下方法将 isFetching 设置为 true:

this.setState({ isFetching: true });

最后,当数据到达时,您再次将其设置为 false:

this.setState({ isFetching: false });

现在,在你的渲染函数中你可以做这样的事情:

render () {
 return (
    <div className="something">
      <h3>Some content</h3>
      {this.state.isFetching ? <LoadingComponent /> : (
         <ul>
           {listItems}
         </ul>
      )}
    </div> 
  )
}

通过使用状态,您不必担心告诉您的组件做某事,而是它对状态的变化使用react并相应地呈现它。

更新:

如果您打算实际使用 React,我建议您将您的方法更改为我上面描述的方法(在 the React docs 中阅读更多内容)。也就是说,将 get 函数中的代码移动到 React 组件的 componentDidMount 函数中。如果那是不可能的,你可能只是等着打电话

ReactDOM.render(
  <SliderTabs items={home.data.slider} />,                
  document.getElementById('slider-tabs')
);

直到您的数据到达。

关于javascript - 数据准备好后如何渲染组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461706/

相关文章:

javascript - 使用多种类型的数据发布请求

javascript - 在 react 中创建扩展默认 PropTypes 的自定义 PropTypes

reactjs - React-Native无法读取未定义的属性 'bind'

reactjs - ReactJS中的 '...props'是什么意思?

javascript - 什么是深度不变性?

javascript - 如何强制按顺序加载脚本数组?

javascript - 将 Promise 重构为 Async/await。为什么我的未定义?

javascript - 从页面上的链接触发 fancybox - 具有多个相册的图片库

javascript - 同一页面上的 JQuery Carousel 多个实例

具有多个字段的 Javascript 高级搜索