javascript - 使用突变响应更新 apollo 客户端
问题描述
我有一个登录组件,当提交时,它会调用登录突变并检索用户数据。
当返回用户数据时,我想设置 apollo 客户端状态,但我对如何执行此操作的文档感到困惑:
我的组件看起来像这样:
const LOGIN = gql`
mutation login($username: String!, $password: String!) {
login(username: $username, password: $password) {
username
fullName
}
}
`
const Login = () => {
const onSubmit = (data, login) => {
login({ variables: data })
.then(response => console.log("response", response))
.catch(err => console.log("err", err))
}
return (
<Mutation
mutation={LOGIN}
update={(cache, { data: { login } }) => {
}}
>
{(login, data) => {
return (
<Fragment>
{data.loading ? (
<Spinner />
) : (
<Form buttonLabel="Submit" fields={loginForm} onChange={() => {}} onSubmit={e => onSubmit(e, login)} />
)}
{data.error ? <div>Incorrect username or password</div> : null}
</Fragment>
)
}}
</Mutation>
)
}
如您所见,我的突变中有更新道具,它接收login
参数并具有我想在阿波罗客户端状态中设置的用户数据。
这里的示例将响应写入缓存cache.writeQuery
,但我不确定这是否是我想要做的。我是否不想像在此示例中更新本地数据那样写入客户端(而不是缓存)?
only的 update 属性mutation
似乎接收缓存参数,所以我不确定是否有任何方法可以访问client
而不是cache
.
如何使用 mutate 的更新属性中的突变响应来更新我的 apollo 客户端状态?
编辑:我的客户:
const cache = new InMemoryCache()
const client = new ApolloClient({
uri: "http://localhost:4000/graphql",
clientState: {
defaults: {
locale: "en-GB",
agent: null /* <--- update agent */
},
typeDefs: `
enum Locale {
en-GB
fr-FR
nl-NL
}
type Query {
locale: Locale
}
`
},
cache
})
解决方案
使用上下文 API
如果您使用ApolloProvider将组件包装在层次结构中更高的位置
-
const Login = () => { const onSubmit = async (data, login, client) => { const response = await login({ variables: data }); if (response) { client.whatever = response; } }; return ( <ApolloConsumer> {client => ( <Mutation mutation={LOGIN}> {login => <Form onSubmit={e => onSubmit(e, login, client)} />} </Mutation> )} </ApolloConsumer> ); };
与阿波罗一起使用
const Login = client => { const onSubmit = async (data, login) => { const response = await login({ variables: data }); if (response) { client.whatever = response; } }; return ( <Mutation mutation={LOGIN}> {login => <Form onSubmit={e => onSubmit(e, login)} />} </Mutation> ); }; withApollo(Login);
没有上下文 API
import { client } from "wherever-you-made-your-client";
并在那里引用它
推荐阅读
- javascript - 如何在 puppeteer 上等待消失微调器?
- python - 如何使用 requests.post python 模块登录网站
- javascript - 如何通过 ReactJs 将巨大的 Json 转换为数组
- python - 如何使用beautifulsoup仅提取文本?
- c - C - 使用 scanf 读取特殊字符,如“ã”
- c++ - 冒泡排序 - 如何使用它?
- php - Symfony HttpClient GET 请求具有多个具有相同名称的查询字符串参数
- json - Golang 中的类型转换
- c++ - QUDPSocket 无法从远程以太网接收
- angular - 如何使用 Firebase 功能部署 Angular 9 通用应用程序