突变后 React Apollo 客户端道具 refetchQueries

Posted

技术标签:

【中文标题】突变后 React Apollo 客户端道具 refetchQueries【英文标题】:React Apollo client prop refetchQueries after mutation 【发布时间】:2019-02-17 03:27:44 【问题描述】:

我一直在阅读 Apollo 文档,但找不到任何关于如何在使用 withApollo HOC 传递的 client 道具发生突变后重新获取的示例。

我的组件:

import React, Fragment from 'react';
import gql from 'graphql-tag';
import  withApollo  from 'react-apollo';
...

const getPosts =  gql`

    posts 
    _id
    title
    description
    user 
        _id
    
  
`;


const deletePost = gql`
    mutation deletePost($_id: String)
        deletePost(_id: $_id)
    
`;

class PostList extends React.Component 
    static propTypes = 
        match: PropTypes.object.isRequired,
        history: PropTypes.object.isRequired,
    ;
    state = posts: null;

    componentDidMount() 
        this.props.client.query(
                query: getPosts,
            ).then(( data ) => 
                this.setState( posts: data.posts );
            );
    

    deletePost = postId => 
        this.props.client
            .mutate(
                mutation: deletePost,
                variables: 
                    _id: postId
                ,
            )
            .then(( data ) => 

                alert('Post deleted!');
            );
    ;


    render() 
        const posts = this.state;    
        if (!posts) 
            return <div>Loading....</div>
        

        return (
            <div className="post">
                ...stuff...
            </div>
        )
    


export default withApollo(PostList);

我想在每次删除帖子时重新获取帖子。

【问题讨论】:

【参考方案1】:

您呈现的posts 数据处于组件状态,但您仅查询componentDidMount 中的帖子。仅当您的组件首次渲染时才会调用此方法。

class PostList extends React.Component 

    fetchPosts() 
        this.props.client.query(
                query: getPosts,
            ).then(( data ) => 
                this.setState( posts: data.posts );
            );
    

    componentDidMount() 
        this.fetchPosts();
    

    deletePost = postId => 
        this.props.client
            .mutate(
                mutation: deletePost,
                variables: 
                    _id: postId
                ,
            )
            .then(( data ) => 
                this.fetchPosts()
            );
    ;


    render() 
        const posts = this.state;    
        if (!posts) 
            return <div>Loading....</div>
        

        return (
            <div className="post">
                ...stuff...
            </div>
        )
    

其实你甚至不需要本地状态,你可以依赖Apollo客户端本地缓存,使用Query组件以及Mutation组件。

【讨论】:

以上是关于突变后 React Apollo 客户端道具 refetchQueries的主要内容,如果未能解决你的问题,请参考以下文章

React Apollo 在突变后更新客户端缓存

阿波罗突变未出现在道具中

是否可以将变量传递给 react-apollo 的“儿童”道具?

React-apollo 突变 writeQuery 不更新 ui

React Native、GraphQL、Apollo - 突变期间抛出的错误

Apollo:数据/突变道具未传递给组件