前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Relay的麻烦之处

关于Relay的麻烦之处

作者头像
从今若
发布2019-09-19 14:59:15
7310
发布2019-09-19 14:59:15
举报
文章被收录于专栏:家劲家劲家劲

问题背景

由于QueryRender是直接将数据塞进Render()里的

  handleUpdate = (hasNextPage, xdata) =>{
    console.log(3);
    const data = this.state.data.concat(xdata);
    this.setState({
      data: data,
      loadingMore: false,
      hasNextPage: hasNextPage
      }, () => {
        window.dispatchEvent(new Event('resize'));
      });
  }
  render(){
    return(
      <QueryRenderer
      environment={env}
      query={SearchListQuery}
      variables={{
        search: this.props.search,
        first: this.props.pageSize,
        after: this.state.after
      }}
      render={({error, props}) => {
      if (error) {
          console.log(error)
      }

      if (!props) {
          return (<Spin   className={"selection-spin"} size={'large'}/>)
      }
      this.handleUpdate(props.bookList.hasNextPage, props.bookList.edges);  
      const loadMore = this.state.hasNextPage ? (
        <div style={{ textAlign: 'center', marginTop: 12, height: 32, lineHeight: '32px' }}>
          {this.state.loadingMore && <Spin />}
          {!this.state.loadingMore && <Button onClick={() =>  {
            this.setState({
              loadingMore: true,
              after: props.bookList.pageInfo.endCursor});
          }}>加载更多</Button>}
        </div>
      ) : null;
      const mydata = this.state.data.concat(props.bookList.edges);
      return (
        <SearchListComponent  loadMore={loadMore}  dataSource={mydata}/>
      )
      }}
      />     
    )
  }

直接在render里进行setState会导致组件无限循环渲染,当然把queryrender取缔掉用fetch替换可以解决,但是怎么在使用relay的同时直接setState呢?

改进一:

export default class SearchList extends PureComponent{
  state={
    after: "",
    data: [],
  }
  updateAfter = (after, xdata) =>{
    const data = this.state.data.concat(xdata);
    this.setState({after: after, data: data},
    () =>{
      window.dispatchEvent(new Event('resize'));
    });
  }
  render(){
    return(
      <QueryRenderer
      environment={env}
      query={SearchListQuery}
      variables={{
        search: this.props.search,
        first: this.props.pageSize,
        after: this.state.after
      }}
      render={({error, props}) => {
      if (error) {
          console.log(error)
      }
      return (
        <SearchListComponent 
        loading={!props && this.state.after== ""}
        loadingMore={!props}
        updateAfter={() => this.updateAfter(props.bookList.pageInfo.endCursor, props.bookList.edges)}
        hasNextPage={props ? props.bookList.pageInfo.hasNextPage : null}  
        dataSource={props ? this.state.data.concat(props.bookList.edges) : this.state.data}/>
      )
      }}
      />     
    )
  }

}
class SearchListComponent extends PureComponent{
    constructor(props){
      super(props)
    }
    componentWillReceiveProps = (nextProps) =>{
      console.log(1)
      window.dispatchEvent(new Event('resize'));

    }


    render(){
      const loadMore = this.props.hasNextPage ? (
        <div style={{ textAlign: 'center', margin: 12, height: 32, lineHeight: '32px' }}>
          {this.props.loadingMore && <Spin />}
          {!this.props.loadingMore && <Button onClick={() =>{
            this.props.updateAfter();
          }}>加载更多</Button>}
        </div>
      ) : null;
      return(
        <List
        itemLayout="horizontal"
        loading={this.props.loading}
        loadMore={loadMore}
        dataSource={this.props.dataSource}
        grid={{ gutter: 24, xs: 1, sm: 1, md: 1, lg: 1, xl: 1, xxl: 1}}
        renderItem={item=> (
          <List.Item>
          <a href={`/info/${item.node.bookId}`}>
          <Card 
          hoverable
          bordered={false}
          className={"book-list" }
          cover={<img alt={item.node.bookName} src={item.node.cover} />}>
            <Meta
              title={item.node.bookName} 
              description={
                <div>
                  <div className="book-list-summary" >{item.node.summary.replace(/<br>/g, '        ')}</div>
                  <div className="book-list-info"><span>{item.node.author}</span><span className="split">|</span><span style={{color: 'red'}}>{item.node.clickTimes}</span>&nbsp;点击</div>
                </div>
              }
            />     
          </Card>
          </a>
        </List.Item>
        )}
        />
      )
    }
  }

缺陷:点击加载更多会闪一下,因为render会走两遍,第一遍是加载中,return null

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景
  • 改进一:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档