加载在获取分页请求时显示的文本

Loading text shown on fetching pagination requests

我有一个使用 react-apollo 获取列表的 React 组件。服务器正在使用中继式连接。

我的问题是,当我获取下一页时,它显示 "Loading..." 然后页面光标移回顶部,如下所示。

https://imgur.com/a/ImfQPVJ

我想要更好的用户体验,不显示 "Loading..." 文本,并且在获取后,将新获取的结果附加到列表的后面。

这是代码(去掉不相关的代码):

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> <Mutation>,我们总是可以自己获取Apollo客户端并更好地处理查询交互?

由于您已经在缓存中拥有从之前页面获取的数据,因此您可以在等待获取新数据的同时在 if(加载)中有条件地呈现该数据。

if(loading) {
    return data.allLinks ? 
       <> 
           <LinksComponent {/*pass in the old data here...*/}/>
           <Spinner/>
       </> : <Spinner/>
}

如果您已经有 data.allLinks,即使正在获取新数据,您也会在 LinksComponent 中显示该数据。当 Loading 为真时,Spinner 组件将显示在 LinksComponent 下。如果您没有获取任何数据,您将只显示 Spinner 组件。