Skip to main content

useDataMutation Hook

Declaratively define data mutations and respond to loading / error / data state changes.

Basic Usage:

import { useDataMutation } from '@dhis2/app-runtime'

// Within a functional component body
const [mutate, { called, loading, error, data }] = useDataMutation(
mutation,
options
)

Input

NameTypeRequiredDescription
mutationMutationrequiredThe Mutation definition describing the requested action
optionsObjectAn optional set of query options
options.variablesObjectVariables to be passed to the dynamic portions of the mutation
options.onCompleteFunctionCallback function to be called on successfull completion of the mutation. Called with the response data as the only argument.
options.onErrorFunctionCallback function to be called on failure of the mutation. Called with the error instance as the only argument.
options.lazybooleanIf false, run the mutation immediately after the component mounts.
Default: true

Output

NameTypeDescription
mutateFunctionThis function can be called to execute the mutation. Any in-flight HTTP requests will automatically be aborted.
calledbooleantrue if the mutation has been triggered by a call to the mutate function or on component mount with lazy: false
loadingbooleantrue if the data is not yet available and no error has yet been encountered
errorError
or
undefined
undefined if no error has occurred, otherwise the Error which was thrown
dataQueryResult
or
undefined
undefined if the data is loading or an error has occurred, otherwise a map from the name of each QueryDefinition defined in the Query to the resulting data for that query
engineData EngineA reference to the DataEngine instance

Example

import React from 'react'
import { useDataMutation } from '@dhis2/app-runtime'

const mutation = {
resource: 'indicators',
id: ({ id }) => id,
type: 'delete',
}

export const DeleteButton = ({ indicatorId, onDelete }) => {
const [mutate] = useDataMutation(mutation, {
onComplete: onDelete,
variables: {
id: indicatorId,
},
})

return <button onClick={mutate}>Delete</button>
}

See the Indicator component in the example app for an example of an update mutation

See the AddButton component in the example app for an example of an create mutation