突变后,如何在视图之间更新受影响的数据?

atk*_*yla 6 graphql apollostack react-apollo

在此处输入图片说明

我有getMovies查询和addMovie变异工作。addMovie但是,如果发生这种情况,我想知道如何最好地更新“编辑电影”和“我的个人资料”中的电影列表以反映所做的更改。我只需要一个一般/高级概述,或者甚至只是一个概念的名称(如果很简单)就如何实现这一目标。

我最初的想法只是在Redux商店中保存所有电影。突变完成后,它应该返回新添加的电影,我可以将其连接到商店中的电影。

在“添加电影”之后,它将弹出回到“编辑电影”屏幕,您应该可以在其中看到新添加的电影,然后,如果您返回“我的个人资料”,它也会在那里。

除了将其全部保存在自己的Redux商店中,还有更好的方法吗?有什么我不知道的阿波罗魔法可以为我处理此更新吗?


编辑:我发现了以下想法updateQuerieshttp : //dev.apollodata.com/react/cache-updates.html#updateQueries我认为这是我想要的(请告诉我这是否是不正确的方法)。这似乎比使用我自己的Redux存储的传统方式更好。

// this represents the 3rd screen in my picture
const AddMovieWithData = compose(
  graphql(searchMovies, {
    props: ({ mutate }) => ({
      search: (query) => mutate({ variables: { query } }),
    }),
  }),
  graphql(addMovie, {
    props: ({ mutate }) => ({
      addMovie: (user_id, movieId) => mutate({
        variables: { user_id, movieId },
        updateQueries: {
          getMovies: (prev, { mutationResult }) => {
            // my mutation returns just the newly added movie
            const newMovie = mutationResult.data.addMovie;

            return update(prev, {
              getMovies: {
                $unshift: [newMovie],
              },
            });
          },
        },
      }),
    }),
  })
)(AddMovie);
Run Code Online (Sandbox Code Playgroud)

经过addMovie突变,这正常更新“我的个人资料”的观点,因为它使用的getMovies查询(哇)!然后,我将这些电影作为道具传递到“编辑电影”中,那么我也该如何对其进行更新?我应该让他们两个都使用getMovies查询吗?有没有办法将新结果getMovies从商店中取出,这样我可以在“编辑电影”上重用它而无需再次执行查询?


EDIT2:包装MyProfileEditMoviesgetMovies查询容器都似乎工作正常。之后addMovie,它在这两个地方的经更新由于updateQueriesgetMovies。它也很快。我认为它正在被缓存?

一切都可行,所以我想这只是一个问题:这是最好的方法吗?

Gre*_*ade 3

标题问题的答案是

使用updateQueries“通知”驱动其他视图的查询数据已更改(正如您所发现的)。

这个话题在react-apollo slack 频道中得到了持续的讨论,这个答案是我所知道的共识:没有明显的替代方案。

请注意,您可以更新多个查询(这就是名称为复数的原因,并且参数是一个对象,其中包含与所有需要更新的查询的名称相匹配的键)。

正如您可能猜到的,这种“模式”确实意味着您需要小心设计和使用查询,以使设计突变的过程变得轻松且可维护。更常见的查询意味着您在突变操作中错过查询的可能性更小updateQueries