加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactjs – 使用Apollo Client动态设置React组件的GraphQL查询

发布时间:2020-12-15 05:04:11 所属栏目:百科 来源:网络整理
导读:我正在构建一个React前端,它允许用户从静态查询列表中选择“活动”查询,并展平到要在表格中显示的结果.将GraphQL查询从更高阶组件传递到嵌套子组件的最佳方法是什么? 我见过的大多数文档/解决方案都侧重于将动态条件从组件状态绑定到组件的静态查询,这对我
我正在构建一个React前端,它允许用户从静态查询列表中选择“活动”查询,并展平到要在表格中显示的结果.将GraphQL查询从更高阶组件传递到嵌套子组件的最佳方法是什么?

我见过的大多数文档/解决方案都侧重于将动态条件从组件状态绑定到组件的静态查询,这对我的目的不起作用,因为不同的静态查询具有不同的字段并查询不同的节点类型.

这里的最佳实践/推荐方法是什么?我觉得这不是一个非常独特的用例,但我似乎找不到任何类似的例子.

我使用Apollo-Client / Redux作为我的客户端商店.

以下是组件的粗略轮廓:

class GridViewPage extends React.Component{
  constructor(props,context) {
    super(props,context);
    this.state = {
      activeQuery = ... Stores the selected query ...
    };
  }

  render() {
    return (
      <div className="gridContainer">
        ...Component here allows users to select a query from active list and saves it/it's ID/Index to the state...

        <Panel collapsible>
        ...Some toolbar components...
        </Panel>
        ...Component here displays the result of the query (Ideally by receiving the query or the result of as a prop?)...
      </div>
    );
  }
}

GridViewPage.propTypes = {
  grids: PropTypes.array.isRequired,actions: PropTypes.object.isRequired
};

function mapStateToProps(state,ownProps) {
  return {
      // Receives list of available queries as a prop
      grids: state.grids
  };
}
我们来看,例如,以下组件:

ProfileWithData.js

import React,{ Component,PropTypes } from 'react';
import { graphql } from 'react-apollo';
import gql from 'graphql-tag';

class Profile extends Component { ... }
Profile.propTypes = {
  data: PropTypes.shape({
    loading: PropTypes.bool.isRequired,currentUser: PropTypes.object,}).isRequired,};

// We use the gql tag to parse our query string into a query document
const CurrentUserForLayout = gql`
  query CurrentUserForLayout {
    currentUser {
      login
      avatar_url
    }
  }
`;

const ProfileWithData = graphql(CurrentUserForLayout)(Profile);

它很容易用higher order component包裹它:

Profile.js

import React,PropTypes } from 'react';

export class Profile extends Component { ... }
Profile.propTypes = {
  data: PropTypes.shape({
    loading: PropTypes.bool.isRequired,};

createProfileWithData.js

import React,PropTypes } from 'react';
import { graphql } from 'react-apollo';
import { Profile } from './Profile'

export default function createProfileWithData(query) => {
  return graphql(query)(Profile);
}

然后你会像这样使用它:

Page.js

import React,PropTypes } from 'react';
import gql from 'graphql-tag';
import createProfileWithData from './createProfileWithData';

class Page extends Component {  

  renderProfileWithData() {

      const { textQuery } = this.props;
      // Simplest way,though you can call gql as a function too
      const graphQLQuery = gql`${textQuery}`;

      const profileWithDataType = createProfileWithData(graphQLQuery);

      return (
        <profileWithDataType />
      );
  }

  render() {

    return (<div>
                ..
                {this.renderProfileWithData()}
                ..
           </div>)
  }

}

Profile.propTypes = {
  textQuery: PropTypes.string.isRequired,};

我认为你说对了.

当然,您的配置文件不会收到props.data.currentUser,而是它将是props.data.*取决于根查询,您将根据内容适当地处理它.

注意:这是直接在Stack Overflow中编写的,所以如果你遇到任何问题 – lmk我会修复它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读