relay-runtime
Version:
A core runtime for building GraphQL-driven applications.
72 lines (51 loc) • 3.09 kB
text/mdx
---
id: local-data-updates
title: Local Data Updates
slug: /guided-tour/updating-data/local-data-updates/
description: Other APIs for modifying store data
keywords:
- client-only
- commitLocalUpdate
- commitPayload
---
import DocsRating from '@site/src/core/DocsRating';
import {OssOnly, FbInternalOnly} from 'docusaurus-plugin-internaldocs-fb/internal';
// @fb-only
There are a couple of APIs that Relay provides in order to make purely local updates to the Relay store (i.e. updates not tied to a server operation).
Note that local data updates can be made both on [client-only data](../client-only-data/), or on regular data that was fetched from the server via an operation.
## commitLocalUpdate
To make updates using an [`updater`](../imperatively-modifying-store-data/) function, you can use the `commitLocalUpdate` API:
```js
import type {Environment} from 'react-relay';
const {commitLocalUpdate, graphql} = require('react-relay');
function commitCommentCreateLocally(
environment: Environment,
feedbackID: string,
) {
return commitLocalUpdate(environment, store => {
// Imperatively mutate the store here
});
}
module.exports = {commit: commitCommentCreateLocally};
```
* `commitLocalUpdate` update simply takes an environment and an updater function.
* `updater` takes a *`store`* argument, which is an instance of a [`RecordSourceSelectorProxy`](../../../api-reference/store/); this interface allows you to *imperatively* write and read data directly to and from the Relay store. This means that you have full control over how to update the store: you can *create entirely new records*, or *update or delete existing ones*.
* Unlike regular and optimistic updaters that are accepted by the mutation and subscription APIs, the updater passed to `commitLocalUpdate` does not accept a second parameter. This is because there is no associated network response.
* Note that any local data updates will automatically cause components subscribed to the data to be notified of the change and re-render.
## commitPayload
`commitPayload` takes an `OperationDescriptor` and the payload for the query, and writes it to the Relay Store. The payload will be resolved like a normal server response for a query, and will also resolve Data Driven Dependencies that are passed as `JSResource`, `requireDefer`, etc.
```js
import type {FooQueryRawResponse} from 'FooQuery.graphql'
const {createOperationDescriptor} = require('relay-runtime');
const operationDescriptor = createOperationDescriptor(FooQuery, {
id: 'an-id',
otherVariable: 'value',
});
const payload: FooQueryRawResponse = {...};
environment.commitPayload(operationDescriptor, payload);
```
* An `OperationDescriptor` can be created by `createOperationDescriptor`; it takes the query and the query variables.
* The payload can be typed using the Flow type generated by adding the directive `` to the query.
* Note that any local data updates will automatically cause components subscribed to the data to be notified of the change and re-render.
// @fb-only
<DocsRating />