【问题标题】:graphql cache DataIdFromObject not causing React re-rendergraphql 缓存 DataIdFromObject 不会导致 React 重新渲染
【发布时间】:2018-12-03 15:40:33
【问题描述】:

我在一个反应​​组件中定义了两个突变onLikeonSubmit。对于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>

// --- 阿波罗连接

const enhancer = compose(
    graphql(fetchSongQuery, {
        options: props => ({
            variables: {
                id: props.params.id,
            },
        }),
    }),
    graphql(addLyricQuery, { name: "addLyricQuery" }),
    graphql(likeLyricQuery, { name: "likeLyricQuery" })
);
export default enhancer(SongDetail);

// --- 添加歌词查询

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
        }
    }
`;

// --- 阿波罗商店

const client = new ApolloClient({
    dataIdFromObject: o => o.id
});

我会看到什么?

我希望onSubmitonLike 之间的行为相同。因此,当我单击任一按钮时,它应该只查询一次,而无需重新获取数据。

我看到了什么?

onLike 按预期工作。单击时,它只发出一个突变,并且立即渲染 react 组件。

onSubmit 将我带到一个空白页面,然后一旦我刷新页面,就会显示新数据。我可以通过使用refetchrefetchQueries: [] 使其工作,但这不是重点。

【问题讨论】:

  • 你是如何附加你的 onSubmit 和 onLike 处理程序的?
  • 箭头函数。该函数确实被调用。我认为这不是问题。
  • @AndrewIngram 已更新!

标签: reactjs graphql react-apollo


【解决方案1】:

onSubmit 函数的上下文未绑定,因此您不会阻止默认表单行为

改变:

<button onClick={e => this.onSubmit(e)}>Submit</button>

到:

<button onClick={this.onSubmit.bind(this)}>Submit</button>

【讨论】:

  • 箭头函数绑定到范围。 es6
  • 请阅读问题,它说它适用于一个按钮。问题与graphql的refetch有关
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多