gpt4 book ai didi

javascript - RelayJS 无限滚动

转载 作者:行者123 更新时间:2023-11-29 14:40:05 25 4
gpt4 key购买 nike

我试图在我的 React-Relay 前端中进行无限滚动分页,但没有成功。

此刻,我有这个 React 组件......

class List extends Component {
state = { loading: false };

componentDidMount() {
window.onscroll = () => {
if (!this.state.loading
&& (window.innerHeight + window.scrollY)
>= document.body.offsetHeight) {

this.setState({loading: true}, () => {
this.props.relay.setVariables({
count: this.props.relay.variables.count + 5
}, (readyState) => {
if (readyState.done) {
this.setState({ loading: false });
}
});
});
}
}
}

render() {
return (
<div>
{this.props.viewer.products.edges.map(function(product, i) {
return (<Item key={i} product={product.node} />);
})}
</div>
);
}
};

...包裹在中继容器中

export default Relay.createContainer(List, {
initialVariables: {
count: 5
},
fragments: {
viewer: () => Relay.QL`
fragment on Viewer {
products(first: $count) {
total
edges {
node {
${Item.getFragment('product')}
}
}
}
}
`,
}
});

这背后的逻辑似乎很简单。如果您到达某个 scrollY 位置,请为 count 变量设置一个新的增量值,这会扩展您的边列表。

但是这个概念会导致一种情况,一开始我查询数据库的前 5 条记录,但最近当我不断滚动时,将查询 N+5 条记录。最后我会查询整个表(数千条记录)的数据库!这是完全不能接受的。

所以我正在尝试实现一个游标,但我不知道如何从连接中获取数据并扩展结果。这种方法返回一个“分页”列表。


此外,当我向下滚动时,上面的代码给了我这个错误

resolveImmediate.js?39d8:27 Uncaught Invariant Violation: performUpdateIfNecessary: Unexpected batch number (current 19, pending 18)

我将非常感谢任何帮助或示例!

最佳答案

问题解决了!

关于每次滚动一遍又一遍地获取 N+5 条记录的问题,Relay 似乎非常智能,因为它通过查询 cursor< 自动“分页”我的连接 并在我的连接中管理 after arg。

在我后端的 graphql-sequelize 的帮助下,它简单地变成了这个查询

SELECT ... FROM product ORDER BY product.id ASC LIMIT 5 OFFSET 10

这实际上解决了我关于性能的第一个问题。 :)

所以我的 Relay.QL 查询已经被转换成这个

query ListPage_ViewerRelayQL($id_0:ID!) {
node(id:$id_0) {
...F1
}
}
fragment F0 on Product {
id,
title,
price
}
fragment F1 on Viewer {
_products4tSFq4:products(after:"YXJyYXljb25uZWN0aW9uJDUkNA==",first:5) {
edges {
cursor,
node {
id,
...F0
}
},
pageInfo {
hasNextPage,
hasPreviousPage
}
},
id
}

当我在我的 GraphQL 后端运行这个查询时,它返回了空结果

{
"data": {
"node": null
}
}

然后我立即意识到问题出在哪里以及为什么我的 Relay 崩溃了。

问题在于重新获取查看器。我没有正确实现 nodeDefinitions,当查看器 ID 命中 idFetchertypeResolver 时,它失败并返回了一个 。在那之后,在客户端,Relay 无法完成我的连接的重新获取并崩溃了!

经过小修和后端修复后,我的无限滚动就像一个魅力! :)

关于javascript - RelayJS 无限滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com