跳过到主要内容
版本: v18.0.0

流式分页

此外,我们可以将 usePaginationFragment 与 Relay 的增量数据交付功能结合起来,以获取连接并增量接收连接中的每个项目,而不是等待整个项目列表在单个负载中返回。当例如计算连接中的每个项目是服务器中的一个昂贵操作时,这可能很有用,并且我们希望能够尽快显示列表中的第一个项目(或项目),而不会阻塞在我们需要变得可用的所有项目上;例如,在新闻提要中,用户理想情况下可以查看并开始与第一个故事进行交互,而额外的故事则在下面加载。

为了做到这一点,我们可以使用 @stream_connection 指令而不是 @connection 指令。

import type {FriendsListComponent_user$key} from 'FriendsList_user.graphql';

const React = require('React');

const {graphql, usePaginationFragment} = require('react-relay');

type Props = {
user: FriendsListComponent_user$key,
};

function FriendsListComponent(props: Props) {
// ...

const {
data,
loadNext,
hasNext,
} = usePaginationFragment(
graphql`
fragment FriendsListComponent_user on User
@refetchable(queryName: "FriendsListPaginationQuery") {
name
friends(first: $count, after: $cursor)
@stream_connection(key: "FriendsList_user_friends", initial_count: 2,) {
edges {
node {
name
age
}
}
}
}
`,
props.user,
);

return (...);
}

module.exports = FriendsListComponent;

让我们提炼一下这里发生了什么

  • @stream_connection 指令可以直接替换 @connection 指令;它接受与 @connection 相同的参数,以及控制流式的其他可选参数。
    • initial_count: Int:一个数字(默认为零),控制初始负载中将包含多少个项目。任何后续项目都将流式传输,因此当设置为零时,列表最初将为空,并且所有项目都将流式传输。请注意,此数字不会影响返回的总数,而只会影响初始负载中包含的项目数。例如,考虑一个产品,今天它最初获取 2 个项目,然后立即发出一个分页查询以获取 3 个更多项目。使用流式传输,该产品可以选择在初始查询中使用 initial_count=2 获取 5 个项目,以便快速获取 2 个项目,同时避免为后续的 3 个项目进行往返。
  • 与使用 usePaginationFragment 的常规用法一样,连接将在服务器从服务器流式传输新项目时自动更新,并且组件将在每次使用连接中的最新项目重新渲染时重新渲染。

此页面有用吗?

通过 回答几个快速问题.