阿波罗反应:切换查询参数的正确方法

Posted

技术标签:

【中文标题】阿波罗反应:切换查询参数的正确方法【英文标题】:apollo react: proper way to switch a query's params 【发布时间】:2018-04-04 06:36:07 【问题描述】:

在我的应用程序中,我有一个带有“已保存搜索”列表的侧边栏和一个应该显示搜索结果的中心区域。每当我点击已保存的搜索链接时,我都想用该搜索的结果更新中心区域。

使用 apollo-react 的正确方法是什么?

我试过这个:

// SidebarConnector.js:
const withVideoSearch = graphql(
  VIDEO_SEARCH_QUERY,
  
    name: 'videoSearchQuery',
    props: ( videoSearchQuery ) => 
      return (
        searchVideos: videoSearchQuery.refetch,
      );
    ,
  
);
export default withVideoSearch(Sidebar);

我保存的搜索在点击时执行searchVideos( query: "some query" ),基于上述内容,正在使用不同变量重新获取VIDEO_SEARCH_QUERY 查询。 这工作正常,调用 graphql 服务器并返回结果就好了。

对于显示我使用的结果列表的主要组件:

export default graphql(VIDEO_SEARCH_QUERY)(ResultList);

最初,主要组件从服务器获取结果,就好像查询是在没有变量的情况下完成的,这很好,正是我想要的。

问题在于,每次重新获取似乎都会在 apollo 的商店中的 ROOT_QUERY 中创建一个不同的条目,而我的主要组件被“锁定”在没有变量的那个中。

这是 apollo 商店在初始提取和保存的搜索触发的重新提取之一之后的样子:

ROOT_QUERY
  searchVideos("query":"coke"): [Video]
    0:▾Video:arLaecAu5ns
  searchVideos("query":null): [Video]
    0:▾Video:3HXg-oVMA0c

所以我的问题是如何将主组件切换到“当前搜索”或如何在每次刷新时覆盖存储,以便只有一个键以便主组件正确更新。

为了完整起见,这是我的VIDEO_SEARCH_QUERY

export const VIDEO_SEARCH_QUERY = gql`
  query searchVideos($query: String) 
    searchVideos(query: $query) 
      ...fVideo
    
  
  $fVideo
`;

【问题讨论】:

【参考方案1】:

也许我误解了您的用例,但似乎没有必要在这里使用 refetch。将选择的搜索字符串作为状态持久化会更简单,将该状态作为道具传递给您的主要组件,然后将该道具用作 GraphQL 请求中的变量。因此,graphql 组件内的 graphql 调用看起来像这样:

const options = props => ( variables:  query: props.searchString  )
export default graphql(VIDEO_SEARCH_QUERY,  options )(ResultList);

然后,只需让每个保存的搜索的 onClick 处理程序将状态设置为该搜索字符串的状态,然后 Apollo 将完成剩下的工作。使用 Redux 非常简单——只需触发适当的操作。如果你不使用 Redux,你可能需要 lift the state up 以便它可以作为道具传递下来,但概念是一样的。

【讨论】:

Doh...谢谢!证明一个人应该不时休息一下。

以上是关于阿波罗反应:切换查询参数的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Angular 反应复选框仅在第一次单击后正确切换

模拟阿波罗链路状态

阿波罗:多重突变

反应路由器查询参数字符串加载默认页面'/'

如何连续进行 graphql 调用?反应阿波罗

突变后反应阿波罗不更新数据