当Apollo提取的数据准备就绪时,React& GraphQL

时间:2017-03-02 15:32:28

标签: reactjs promise graphql apollo-client

  1. 我想根据GraphQL查询呈现一个以初始值(Calendar)开头的日历组件(名为events)。
  2. 当用户按下按钮时,Calendar将只获得一些事件(不需要添加查询)并将重新呈现。 我设法分别做了每个,但不是两个:
  3. 对于(1):仅在数据准备就绪而不使用状态时进行渲染,然后才能完成(2)。 对于(2):使用状态但不能完成(1)。

    以下代码非常简单:

    import React, { Component, PropTypes } from 'react';
    import gql from 'graphql-tag';
    import { graphql } from 'react-apollo';
    
    const requestsQuery = gql`query requestsQuery { ... }
    
    class MainComponent extends Component {
        constructor() {
          super();
          this.state = {
            events: []
          };
          // here i want to know when the data that apollo fetched is ready
          // and then i will create events (using the data)
          // and then:
          // this.setState({events: events});
        }
    
        renderLoader() {
          return (
            <div>
              Loading...
            </div>
          );
        }
    
        onItemClick(){
          // make some events
          this.setState({events: events});
        }
    
        renderCalendar(){
          return (
            <Calendar events={this.state.events}/>
          );
        }
    
        renderRows(requests) {
          return (
            requests.map((request) => {
              return (
                <div>
                  {request.displayName}
                  <button onClick = {this.onItemClick.bind(this, request)}>show only some events</button>
                </div>
              );
            })
          );
        }
    
        render() {
            const { loading, requests } = this.props;
    
            return (
              <div>
                {loading
                    ? this.renderLoader()
                    : <div>{this.renderRows(requests)}</div>
                }
              </div>
            );
        }
    }
    
    const MainComponentWithData = graphql(requestsQuery, {
      props({ ownProps, data: { loading, requests } }) {
        return {
          loading,
          requests
        };
      }, })(MainComponent);
    

    render()方法内部,我知道加载时是假的,因此,数据准备就绪,但我不知道如何在其他地方执行此操作。

    如果我初始化renderRows(requests)中的事件,然后使用this.setState({events: events})则会永远重新发布。

    问题:我如何完成(1)和(2)?

1 个答案:

答案 0 :(得分:6)

我想你想从GraphQL中获取事件。当您单击要重新获取的AnotherComponent项时。

从查询中设置状态的一种可能性是使用componentWillReceiveProps功能。 但是不建议将状态和道具结合起来。

一个例子:

&#13;
&#13;
...
componentWillReceiveProps(newProps) {
    if (!newProps.<query name>.loading) {
       ...
       this.setState({events: events});
    }
  }
  ...
&#13;
&#13;
&#13;