关于Relay的麻烦之处

Posted Kuai Jiajin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Relay的麻烦之处相关的知识,希望对你有一定的参考价值。

问题背景

由于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呢?

以上是关于关于Relay的麻烦之处的主要内容,如果未能解决你的问题,请参考以下文章

从 Relay 中的动态组件获取片段

如何为 GraphQLObjectType 的 GraphQLList 定义 Relay 片段?

片段组合在 Relay 中是如何工作的?

从外部存储中检索 Relay 查询片段的变量

在 React 中渲染 Relay 现代片段

Relay Modern 节点不包含片段属性