在 Apollo Client 2.1 之前
在 Apollo Client 2.1 之前,当您必须使用高阶组件(HOC) 时,有两个解决方案被henk在另一个答案中正确指出。我试着简要总结一下:
由于 HOC 只能访问 props,因此您需要在父组件中引入更改变量。例如,父组件可以使用 React 的setState()
方法为更改变量进行本地状态管理。一旦变量在本地状态中发生变化,它就可以被传递给你的其他组件,该组件由 HOC 增强。HOC 可以访问 props 并且可以使用更改的变量执行查询。提示:如果您不想在两者之间引入另一个组件来更改本地状态,那么recompose的withState
HOC 可能是一个不错的选择。
第二种方式,但可能不太优雅,因为它将您的代码从声明式转换为命令式,它将使用withApollo()
HOC,它使您可以访问 Apollo 客户端实例作为道具。在你的 React 组件中拥有这个实例,一旦你的变量改变,你就可以调用client.query({ query: ..., variables: ... })
你的组件的一个类方法(例如处理程序)。onChange
从 Apollo Client 2.1 开始
从Apollo Client 2.1 开始,您可以使用新的 Query(和 Mutation)组件。尽管如此,HOC 仍然存在,但不再由文档宣传。但是,您的组件中使用了新的 Query(和 Mutation)组件。它使用 React 的渲染道具模式。
import React from "react";
import { Query } from "react-apollo";
import gql from "graphql-tag";
const GET_TODOS = gql`
{
todos {
id
type
}
}
`;
const Todos = () => (
<Query query={GET_TODOS}>
{({ loading, error, data }) => {
if (loading) return <p>Loading...</p>;
if (error) return <p>Error :(</p>;
return data.todos.map(({ id, type }) => (
<p key={id}>{type}</p>
));
}}
</Query>
);
通过将此控制流转移到组件内部,而不是将其仅与 HOC 放在一起,您可以将更改的 prop 作为变量传递给 Query(和 Mutation)组件。
import React from "react";
import { Mutation } from "react-apollo";
import gql from "graphql-tag";
const TOGGLE_TODO = gql`
mutation ToggleTodo($id: Int!) {
toggleTodo(id: $id) {
id
completed
}
}
`;
const Todo = ({ id, text }) => (
<Mutation mutation={TOGGLE_TODO} variables={{ id }}>
{(toggleTodo, { loading, error, data }) => (
<div>
<p onClick={toggleTodo}>
{text}
</p>
{loading && <p>Loading...</p>}
{error && <p>Error :( Please try again</p>}
</div>
)}
</Mutation>
);
如果你想在 React 中学习 Apollo 客户端,请查看这个广泛的教程。注意:代码片段取自 Apollo Client 2.1 发布博客文章。