GraphQL 入门: Apollo Client 存储API
用这四个方法能够让你自定义Apollo Client的行为. 下面我们介绍每个方法的细节. 从存储读取查询第一个和存储交互的方法是 const data = client.readQuery({ query: gql` { todo(id: 1) { id text completed } } ` }); 如果数据在缓存中已经存储,它将会直接返回并存储到组件的 你可以在应用中任何地方使用一个查询,还可以传入变量: import { TodoQuery } form './TodoGraphQL'; const data = client.readQuery({ query: TodoQuery,variables: { id: 5 } });
从存储读取片段有时候你希望重缓存中读取任意的数据,而不仅仅是根查询类型. 对此有一个 client.readFragment({ id: '5',fragment: gql` fragment todo on Todo { id text completed } ` });
const client = new ApolloClient({ dataIdFromObject: o => { if(o.__typename != null && o.id != null) { return `${o.__typename}-${o.id}`; } } }); 因为在 向存储写入查询和片段和读取查询和片段对应的还有 用户不会注意到有什么区别,如果更新数据要对所有用户可见,需要把更新的数据持久化到后端服务器.
client.writeQuery({ query: gql` { todo(id: 1) { completed } } `,data: { todo: { completed: true },},}); 同样的, client.writeFragment({ id: '5',fragment: gql` fragment todo in Todo { completed } `,data: { completed: true } }); 这四个方法让你能够完全的控制缓存中的数据. 使用读和写来更新数据因为从缓存中获取的数据只是一份拷贝,不影响底层的存储. const query = gql` { todos { id text completed } } `; const data = client.readQuery({ query }); data.todos.push({ id: 5,text: 'Hello,world!',completed: false }); client.writeQuery({ query,data }); 在一个Mutation之后执行更新const text = 'Hello,world!'; client.mutate({ // GraphQL Mutation 更新语句 mutation: gql` mutation ($text: String!) { createTodo(text: $text) { id text completed } } `,// 变量 variables: { text,optimisticResponse: { createTodo: { id: -1,// Fake id text,completed: false,// 更新函数 // 用Mutation返回的结果对存储进行更新,并触发React UI组件的重新渲染 update: (proxy,mutationResult) => { const query = gql` { todos { id text completed } } `; // 从缓存中读取数据 const data = proxy.readQuery({ query,}); // 用Mutation的结果更新数据 data.todos.push(mutationResult.createTodo); // 写回缓存 proxy.writeQuery({ query,data,}); },});
updateQueries也可以使用
参考资料
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |