首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加载在获取分页请求时显示的文本

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

Stack Overflow用户
提问于 2019-03-04 13:27:27
回答 1查看 82关注 0票数 0

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

我的问题是,当我获取下一个页面时,它会显示“正在加载...”然后页面光标移回顶部,如下图所示。

https://imgur.com/a/ImfQPVJ

我想有一个更好的用户体验,而不是“加载...”文本显示,在抓取之后,只需将新抓取的结果追加到列表的后面。

这是代码(删除不相关的代码):

代码语言:javascript
运行
复制
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>呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-06 10:02:08

因为缓存中已经有了从以前的页面中获取的数据,所以可以在if (加载)中有条件地呈现该数据,同时等待新数据被获取。

代码语言:javascript
运行
复制
if(loading) {
    return data.allLinks ? 
       <> 
           <LinksComponent {/*pass in the old data here...*/}/>
           <Spinner/>
       </> : <Spinner/>
}

如果您已经有了data.allLinks,那么即使在获取新数据时,您也会在LinksComponent中显示该数据。当Loading为true时,微调器组件将显示在LinksComponent下。如果您没有获取任何数据,您将只显示微调器组件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54977144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档