如何在反应中继中呈现一长串?
How to render a long list in react-relay?
一个用于react-web的惰性滚动列表组件
回到中继连接,分页抓取,
同时提供良好的性能和内存特性。
有两件事要处理
- 通过提供分页参数来查询数据,操纵中继存储
- 组件渲染,虚拟操作DOM
是否有一些特定的列表组件可以很好地处理这个问题?
是否有实施这一共同机制的既定模式?
此模式几乎是连接的代表性场景。这是一个假设的 <PostsIndex>
组件,它显示带有 "load more" 按钮的帖子列表。如果您不想在处于 isLoading
状态时显式更改 UI,您可以删除构造函数和 setVariables
回调。添加基于视口的无限滚动也不难;你只需要连接一个滚动监听器给你 setVariables
调用。
class PostsIndex extends React.Component {
constructor(props) {
super(props);
this.state = {isLoading: false};
}
_handleLoadMore = () => {
this.props.relay.setVariables({
count: this.props.relay.variables.count + 10,
}, ({ready, done, error, aborted}) => {
this.setState({isLoading: !ready && !(done || error || aborted)});
});
}
render() {
return (
<div>
{
this.props.viewer.posts.edges.map(({node}) => (
<Post key={node.id} post={node} />
))
}
{
this.props.viewer.posts.pageInfo.hasNextPage ?
<LoadMoreButton
isLoading={this.state.isLoading}
onLoadMore={this._handleLoadMore}
/> :
null
}
</div>
);
}
}
export default Relay.createContainer(PostsIndex, {
initialVariables: {
count: 10,
},
fragments: {
viewer: () => Relay.QL`
fragment on User {
posts(first: $count) {
edges {
node {
id
${Post.getFragment('post')}
}
}
pageInfo {
hasNextPage
}
}
}
`,
},
});
一个用于react-web的惰性滚动列表组件 回到中继连接,分页抓取, 同时提供良好的性能和内存特性。
有两件事要处理
- 通过提供分页参数来查询数据,操纵中继存储
- 组件渲染,虚拟操作DOM
是否有一些特定的列表组件可以很好地处理这个问题? 是否有实施这一共同机制的既定模式?
此模式几乎是连接的代表性场景。这是一个假设的 <PostsIndex>
组件,它显示带有 "load more" 按钮的帖子列表。如果您不想在处于 isLoading
状态时显式更改 UI,您可以删除构造函数和 setVariables
回调。添加基于视口的无限滚动也不难;你只需要连接一个滚动监听器给你 setVariables
调用。
class PostsIndex extends React.Component {
constructor(props) {
super(props);
this.state = {isLoading: false};
}
_handleLoadMore = () => {
this.props.relay.setVariables({
count: this.props.relay.variables.count + 10,
}, ({ready, done, error, aborted}) => {
this.setState({isLoading: !ready && !(done || error || aborted)});
});
}
render() {
return (
<div>
{
this.props.viewer.posts.edges.map(({node}) => (
<Post key={node.id} post={node} />
))
}
{
this.props.viewer.posts.pageInfo.hasNextPage ?
<LoadMoreButton
isLoading={this.state.isLoading}
onLoadMore={this._handleLoadMore}
/> :
null
}
</div>
);
}
}
export default Relay.createContainer(PostsIndex, {
initialVariables: {
count: 10,
},
fragments: {
viewer: () => Relay.QL`
fragment on User {
posts(first: $count) {
edges {
node {
id
${Post.getFragment('post')}
}
}
pageInfo {
hasNextPage
}
}
}
`,
},
});