什么是 Relay
Relay 是一个由 Facebook 开发的 JavaScript 框架,它为客户端与 GraphQL 服务器之间的数据交互提供了一个桥梁。通过 Relay,我们可以在客户端定义一个 GraphQL 查询,并且 Relay 会自动帮助我们发送这个查询到服务器并获取数据。Relay 还提供了一些优化策略,例如数据缓存和批量查询等,以提高数据请求的效率。
如何使用 Relay
安装
要使用 Relay,我们需要先安装它。我们可以通过 npm 安装 Relay,并且需要同时安装 react-relay 和 graphql 依赖。
npm install --save relay react-relay graphql
定义 GraphQL 查询
在客户端使用 Relay 获取数据,我们需要先定义一个 GraphQL 查询。这个查询定义了我们需要获取的数据以及它们在服务器端的结构。我们可以使用 GraphQL 的语法来定义这个查询,例如:
-- -------------------- ---- ------- ----- ------- - -------- ------ - ---- ----- -------------- --- - ----- - ---- - ---- - - - - -
这个查询表示我们需要获取 id 为 "123" 的用户的姓名、邮箱和前 10 个好友的姓名。
定义 Relay 容器组件
在客户端使用 Relay 获取数据,我们需要将这个查询与一个 React 组件关联起来。我们可以使用 Relay 提供的容器组件来实现这个功能。容器组件是一个高阶组件,它接收一个 GraphQL 查询作为参数,并将查询结果作为 props 传递给包装的组件。
-- -------------------- ---- ------- ------ ----- ---- -------- ------ - ------------------------ ------- - ---- -------------- -------- ------------------ - ----- - ---- - - ------ ------ - ----- -------------------- ------------------- ---- -------------------------- ---- -- -- - --- ------------------------------ --- ----- ------ -- - ------ ------- ------------------------------------ - ----- -------- -------- ---------------- -- ---- - -- ---- ----- -------------- --- - ----- - ---- - -- ---- - - - - -- ---
这个例子中,我们定义了一个名为 MyComponent 的 React 组件,并将它作为参数传递给 createFragmentContainer 方法。我们还定义了一个名为 MyComponent_user 的 GraphQL 片段,它描述了我们需要获取的数据。在 MyComponent 组件中,我们可以通过 props.user 获取这个 GraphQL 片段的数据。
发送 GraphQL 查询
现在我们已经定义了一个 GraphQL 查询和一个与之关联的 React 组件,我们需要在客户端发送这个查询并获取数据。我们可以使用 Relay 提供的 QueryRenderer 组件来实现这个功能。QueryRenderer 是一个高阶组件,它接收一个 GraphQL 查询和一个包装组件作为参数,并将查询结果作为 props 传递给包装组件。
-- -------------------- ---- ------- ------ ----- ---- -------- ------ -------- ---- ------------ ------ - -------------- ------- - ---- -------------- ------ ----------- ---- ---------------- ----- ----------- - ---- -- --- ----- -- ---------------- -------------- ------------------------- --------------- ----- -------- - -------- ------ - ------------------- - - -- -------------- ---------- ------ ----- -- -- - -- ------- - ------ ------------------ - -- -------- - ------ ---------------------- - ------ ------------ ----------------- --- -- --- ------------------------------- --
这个例子中,我们使用 QueryRenderer 组件发送了一个名为 AppQuery 的 GraphQL 查询,并将查询结果传递给 MyComponent 组件。QueryRenderer 还提供了一个 render 方法,它接收一个回调函数,可以在查询结果返回之前、返回错误或者返回数据时分别渲染不同的组件。
Relay 的优化策略
Relay 提供了一些优化策略,以提高数据请求的效率。下面是一些常用的优化策略:
数据缓存
Relay 会自动缓存已经获取过的数据,以避免重复请求。当我们发送一个新的查询时,Relay 会先检查缓存中是否已经有这个查询的结果。如果有,Relay 就会直接返回缓存中的数据,而不是再次发送请求。
批量查询
Relay 会自动将多个查询合并成一个批量查询,以减少网络请求的数量。当我们在多个组件中使用相同的查询时,Relay 会自动将这些查询合并成一个批量查询,并且只发送一次请求。
数据预取
Relay 可以自动预取与当前查询相关的数据,以避免在后续查询中重复获取相同的数据。当我们发送一个查询时,Relay 会自动查找与这个查询相关的其他查询,并将它们一起发送到服务器。这样可以减少后续查询中的网络请求量。
总结
Relay 是一个非常强大的客户端框架,它为客户端与 GraphQL 服务器之间的数据交互提供了一个桥梁。通过 Relay,我们可以轻松地发送 GraphQL 查询并获取数据,并且还可以使用 Relay 提供的优化策略来提高数据请求的效率。如果你正在开发一个使用 GraphQL 的前端应用程序,那么 Relay 绝对是一个值得学习和使用的框架。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65f96a39d10417a222538f36