2018 更新: Apollo Client 2.1 は、loading プロパティを元に戻す新しい Mutation コンポーネントを追加しました。以下の @robin-wieruch の回答とこちらの発表を参照してください https://dev-blog.apollodata.com/introducing-react-apollo-2-1-c837cc23d926 Apollo の以前のバージョンにのみ適用される元の質問を読み進めてください。
(v0.5.2)の現在のバージョンのhigh graphql
-order-component を使用するとreact-apollo
、ミューテーションがサーバーの応答を待っていることを UI に通知する方法が文書化されていません。以前のバージョンのパッケージでは、読み込みを示すプロパティが送信されていたことがわかります。
ここに記載されているように、クエリはまだ読み込みプロパティを受け取ります: http://dev.apollodata.com/react/queries.html#default-result-props
私のアプリケーションも redux を使用しているため、コンポーネントを redux に接続し、UI を読み込み状態にする関数プロパティを渡すことが 1 つの方法だと思います。次に、graphql ミューテーションをプロパティに書き換えるときに、redux ストアを更新するための呼び出しを行うことができます。
おおよそこのようなもの:
function Form({ handleSubmit, loading, handleChange, value }) {
return (
<form onSubmit={handleSubmit}>
<input
name="something"
value={value}
onChange={handleChange}
disabled={loading}
/>
<button type="submit" disabled={loading}>
{loading ? 'Loading...' : 'Submit'}
</button>
</form>
);
}
const withSubmit = graphql(
gql`
mutation submit($something : String) {
submit(something : $something) {
id
something
}
}
`,
{
props: ({ ownProps, mutate }) => ({
async handleSubmit() {
ownProps.setLoading(true);
try {
const result = await mutate();
} catch (err) {
// @todo handle error here
}
ownProps.setLoading(false);
},
}),
}
);
const withLoading = connect(
(state) => ({ loading: state.loading }),
(dispatch) => ({
setLoading(loading) {
dispatch(loadingAction(loading));
},
})
);
export default withLoading(withSubmit(Form));
ミューテーションが「実行中」であることを UI に通知するための、より慣用的なアプローチがあるかどうか、興味があります。ありがとう。