如何导入 GraphQL 查询?

Bug*_*rUK 4 reactjs graphql react-apollo

我有我的项目设置来导入.graphql文件。这很好用。但我的问题是我不知道如何在一个定义查询.graphql文件,将其导入到与使用的组件react-apollo<Query ...>组件。

此示例中,作者使用gql以下代码在 JavaScript 变量中定义查询:

import gql from "graphql-tag";
import { Query } from "react-apollo";

const GET_DOGS = gql`
  {
    dogs {
      id
      breed
    }
  }
`;

const Dogs = ({ onDogSelected }) => (
  <Query query={GET_DOGS}>
    {({ loading, error, data }) => {
      if (loading) return "Loading...";
      if (error) return `Error! ${error.message}`;

      return (
        <select name="dog" onChange={onDogSelected}>
          {data.dogs.map(dog => (
            <option key={dog.id} value={dog.breed}>
              {dog.breed}
            </option>
          ))}
        </select>
      );
    }}
  </Query>
);
Run Code Online (Sandbox Code Playgroud)

但是,我想将该查询存储在一个单独的.graphql文件中并将其导入到组件中。

这是我在我的项目中尝试过的。这是一个组件,我尝试UserQuery从我的架构中导入。

import React from 'react'
import { Query } from 'react-apollo'

import { UserQuery } from '../api/schema.graphql'

export default () => 
    <Query query={ UserQuery }>
        {({ loading, error, data }) => {
            if (loading) return 'Loading...'
            if (error) return `Error! ${error.message}`
            return
                <ul>
                    {data.users.map(name => <li>{name}</li>)}
                </ul>
        }}
    </Query>
Run Code Online (Sandbox Code Playgroud)

这是schema

# schema.graphql

query UserQuery {
    user {
        name,
        age,
        gender        
    }
}

type User {
    name: String,
    age: Int,
    gender: String
}

type Query {
    say: String,
    users: [User]!
}
Run Code Online (Sandbox Code Playgroud)

当我尝试导入和使用时,出现错误:

modules.js?hash=e9c17311fe52dd0e0eccf0d792c40c73a832db48:28441 警告:道具类型失败:道具query在 中标记为必需Query,但其值为undefined

如何以这种方式导入查询?

Her*_*rku 7

要导入 GraphQL 查询,您需要一个特定的加载器。例如,当您使用 webpack 时,您可以使用graphql-tag/loaderfrom graphql-tag。它将您的查询转换为 JavaScript 模块,以便它们可以被 webpack 导入。此外,您不应将架构和查询放在同一个文件中。我不认为 GraphQL 加载器是为导出模式定义语言而设计的(尽管它可能能够解析它,因为 GraphQL-JS 解析器解析两者)。专门为查询创建一个文件。如果文件中只有一个查询,您可以将查询导入为default

import UserQuery from 'UserQuery.graphql';
Run Code Online (Sandbox Code Playgroud)

如果有多个定义,例如片段、突变等,它们将作为命名导出及其名称导出。

这使得一切都比 GraphQL 加载器更复杂。调试模块的提示:您可以console.log或检查模块的内容。

import * as file from 'UserQuery.graphql';
console.log(file);
Run Code Online (Sandbox Code Playgroud)

这会将对象打印到您的(浏览器)控制台,您可以看到导出的名称作为对象中的键。