У меня есть две мутации onLike
и onSubmit
, определенные в одном компоненте реакции. Для мутации onLike
я могу использовать кэш с DataIdFromObject
для обновления данных без повторной загрузки данных либо с this.props.data.refetch()
, либо с refetchQueries: []
. НО не для onSubmit
мутации.
// --- Реагирующий компонент
onSubmit(e) {
e.preventDefault();
this.props
.addLyricQuery({
variables: {
content: this.state.content,
songId: this.props.params.id,
},
});
}
onLike(id, likes) {
this.props.likeLyricQuery({
variables: { id },
optimisticResponse: {
__typename: "Mutation",
likeLyric: {
id,
__typename: "LyricType",
likes: likes + 1,
},
},
});
}
<button onClick={() => this.onLike(lyric.id, lyric.likes)}>
<button onClick={e => this.onSubmit(e)}>Submit</button>
// --- apollo connect
const enhancer = compose(
graphql(fetchSongQuery, {
options: props => ({
variables: {
id: props.params.id,
},
}),
}),
graphql(addLyricQuery, { name: "addLyricQuery" }),
graphql(likeLyricQuery, { name: "likeLyricQuery" })
);
export default enhancer(SongDetail);
// --- addLyric Query
import gql from "graphql-tag";
export default gql`
mutation AddLyricToSong($content: String, $songId: ID) {
addLyricToSong(content: $content, songId: $songId) {
id
title
lyrics {
id
content
}
}
}
`;
// --- как запрос
import gql from "graphql-tag";
export default gql`
mutation LikeLyric($id: ID!) {
likeLyric(id: $id) {
id
likes
content
}
}
`;
// --- apollo store
const client = new ApolloClient({
dataIdFromObject: o => o.id
});
Что я ожидаю увидеть?
Я ожидаю, что поведение между onSubmit
и onLike
будет таким же. Поэтому, когда я нажимаю на любую кнопку, она должна запрашивать только один раз, без необходимости повторного получения данных.
Что я вижу?
onLike
работает как положено. При щелчке он вызывает только одну мутацию, и компонент реакции отображается немедленно.
onSubmit
выводит меня на пустую страницу, затем, когда я обновляю страницу, отображаются новые данные. Я могу заставить его работать, используя refetch
или refetchQueries: []
, но это не имеет значения.