【问题标题】:search functionality using relay使用中继的搜索功能
【发布时间】:2016-03-24 14:40:00
【问题描述】:

如何使用中继实现搜索功能?

所以,工作流程是

  • 用户导航到search form

初始化视图时不应有任何查询(如在中继容器中)。

  • 用户填写字段值,然后按操作/搜索按钮。

一个中继查询被发送到服务器

  • 从服务器接收结果。

页面显示它,relay 将filtered 结果与本地缓存相协调。

我还没有看到 ad hoc 查询的示例,而只是中继容器的一部分(它在组件初始化之前解析)。那么,如何建模呢。应该是突变吧?

【问题讨论】:

  • 有什么东西阻止你在连接上使用参数和变量吗?所以每次要搜索时,更新初始变量,relay会查询过滤后的结果。
  • 没有什么能阻止我这样做,但我认为它会在容器初始化时发送一个初始请求。我更多地考虑仅在用户启动操作时才发送请求。将尝试您的建议并与您联系。

标签: relayjs


【解决方案1】:

如果我理解正确,您不希望在用户输入一些搜索文本之前不为组件发送任何查询,此时应该发送查询。这可以通过 @Xuorig 发布的示例来完成,并添加一个:使用 GraphQL 的 @include 指令跳过片段,直到设置变量。这是扩展示例:

export default Relay.createContainer(Search, {
  initialVariables: {
    count: 3,
    query: null,
    hasQuery: false, // `@include(if: ...)` takes a boolean
  },
  fragments: {
    viewer: () => Relay.QL`
      fragment on Viewer {
        # add `@include` to skip the fragment unless $query/$hasQuery are set
        items(first: $count, query: $query) @include(if: $hasQuery) {
          edges {
            node {
              ...
            }
          }
        }
      }
    `,
  },
});

最初将跳过此查询,因为包含条件是虚假的。然后,当文本输入发生变化时,组件可以调用setVariables({query: someQueryText, hasQuery: true}),此时@include条件为真,查询将被发送到服务器。

【讨论】:

  • 嗨@joe-savona,可能是最近更改了API,但我不能将字符串与if 一起使用,这会导致错误Argument "if" expected type "Boolean!" but got: "sdsd". irst:9) @include(if:"sdsd")。像search(query: $query, first: $first) @include(if: !!$query) 一样尝试过,但Unexpected ! 也出错了。所以,我最终使用另一个布尔标志来指示 $query 是否为空。有没有办法避免额外的变量?
  • 好点 - @include(if: ...) 只接受布尔值,所以如果 $query 是一个字符串,你需要另一个变量。我会更新答案。
  • 这似乎对我不起作用。它失败并抛出fetchWithRetries(): Still no successful response after 1 retries, giving up. 错误。当hasQuery最初设置为true时,它工作正常。
【解决方案2】:

这是我在项目中实现简单搜索的方式:

export default Relay.createContainer(Search, {
  initialVariables: {
    count: 3,
    title: null,
    category: null,
  },
  fragments: {
    viewer: () => Relay.QL`
      fragment on Viewer {
        items(first: $count, title: $title, category: $category) {
          edges {
            node {
              ...
            }
          }
        }
      }
    `,
  },
});

您的搜索表单只需使用 this.props.relay.setVariables 更新初始变量,然后中继将查询新数据。

【讨论】:

  • 谢谢。但它不会在容器初始化时发送初始请求。我会试试看。再次感谢。
  • 哦。是的,它会发送一个返回所有结果的初始请求。作为一种解决方法,您可以动态附加一个容器,该容器将在用户搜索时包含我在答案中发布的查询,并在没有搜索时显示其他内容。
猜你喜欢
  • 2013-10-03
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多