我有一个使用react-apollo获取列表的react组件。服务器正在使用中继样式连接。
我的问题是,当我获取下一个页面时,它会显示“正在加载...”然后页面光标移回顶部,如下图所示。
我想有一个更好的用户体验,而不是“加载...”文本显示,在抓取之后,只需将新抓取的结果追加到列表的后面。
这是代码(删除不相关的代码):
class Links extends Component {
fetchNextPage = (pageInfo, fetchMore) => ev => {
const { linksOrder } = this.props;
const after = pageInfo.endCursor;
const queryVars = getQueryVarsFromParam(linksOrder, after);
fetchMore({
variables: queryVars,
updateQuery: (previousResult, { fetchMoreResult }) => {
const { allLinks: { nodes: newLinks, pageInfo: newPageInfo }} = fetchMoreResult;
// Handle no new result
if (newLinks.length === 0) return previousResult;
// With new result, we append to the previous result list
let finalResult = previousResult;
finalResult.allLinks.pageInfo = newPageInfo;
finalResult.allLinks.nodes = finalResult.allLinks.nodes.concat(newLinks);
return finalResult;
}
})
}
render() {
const { linksOrder, classes } = this.props;
const { linkGqlCursorAfter: after } = this.state;
const queryVars = getQueryVarsFromParam(linksOrder, after);
return(<Query query={LINKS_QUERY_GQL} variables={queryVars}>
{({ loading, error, data, fetchMore }) => {
if (loading) return <p>Loading...</p>;
if (error) return <p>Error :(</p>;
const { allLinks: { nodes: links, pageInfo }} = data;
return(
<React.Fragment>
<Grid container spacing={8} className={ classes.linksList } >
{ links.map((link, ind) => (
<Grid item key={link.id}><Link ind={ind} link={link}/></Grid>
)) }
{ pageInfo.hasNextPage ? (
<Grid item key={ "fetchNextPage" } style={{ alignSelf: "center" }}>
<Fab onClick={ this.fetchNextPage(pageInfo, fetchMore) }
size="small" color="secondary"><AddIcon /></Fab>
</Grid>)
: null }
</Grid>
</React.Fragment>
)
} }
</Query>)
}
}我怎样才能做到这一点呢?我能想到的另一种方法是根本不使用<Query>标记,而是通过onClick处理程序中的HOC检索Apollo客户端本身,获取结果,并通过更新组件状态将结果添加回links对象。
然后,这就回避了一个问题,当我们总是可以获得<Query>客户端并更好地自己处理查询交互时,我们为什么要使用Apollo <Mutation>呢?
发布于 2019-03-06 10:02:08
因为缓存中已经有了从以前的页面中获取的数据,所以可以在if (加载)中有条件地呈现该数据,同时等待新数据被获取。
if(loading) {
return data.allLinks ?
<>
<LinksComponent {/*pass in the old data here...*/}/>
<Spinner/>
</> : <Spinner/>
}如果您已经有了data.allLinks,那么即使在获取新数据时,您也会在LinksComponent中显示该数据。当Loading为true时,微调器组件将显示在LinksComponent下。如果您没有获取任何数据,您将只显示微调器组件。
https://stackoverflow.com/questions/54977144
复制相似问题