【问题标题】:When the data that Apollo fetched is ready with React & GraphQL当 Apollo 获取的数据使用 React 和 GraphQL 准备就绪时
【发布时间】:2017-07-22 10:07:57
【问题描述】:
  1. 我想根据 GraphQL 查询呈现一个以初始值 (events) 开头的日历组件(名为 Calendar)。
  2. 当用户按下按钮时,Calendar 将仅获得部分事件(无需额外查询)并重新呈现。 我设法分别做每一个,但不能同时做:

对于(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}),react 将永远重新渲染。

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

【问题讨论】:

    标签: reactjs promise graphql apollo-client


    【解决方案1】:

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

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

    一个例子:

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

    【讨论】:

    • 谢谢!为什么不建议将状态和道具结合起来?您是否建议使用不同的架构来实现这一目标?
    • 这里是一些关于使用道具初始化状​​态的进一步阅读链接react Anti-Pattern。一种可能是您在查询中获取所有相关数据并创建发送到渲染函数中的日历元素的事件。现在,当您按下 onClick 时,您会设置一个状态(“月”、“日”的种类),您可以使用它从第一个查询中选择其他值
    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2018-03-06
    • 2012-02-15
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多