问题背景

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

关于Relay的麻烦之处的更多相关文章

  1. 【译】Unity3D Shader 新手教程(1/6)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...

  2. 前馈网络求导概论(一)·Softmax篇

    Softmax是啥? Hopfield网络的能量观点 1982年的Hopfiled网络首次将统计物理学的能量观点引入到神经网络中, 将神经网络的全局最小值求解,近似认为是求解热力学系统的能量最低点(最 ...

  3. Node.js + Web Socket 打造即时聊天程序嗨聊

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...

  4. 更好的pip工作流

    转自:http://codingpy.com/article/a-better-pip-workflow-recommended-by-kenneth/ 现在大家开发Python应用时,在代码库的根目 ...

  5. [转]passport.js学习笔记

    概述 passport.js是Nodejs中的一个做登录验证的中间件,极其灵活和模块化,并且可与Express.Sails等Web框架无缝集成.Passport功能单一,即只能做登录验证,但非常强大, ...

  6. C++中函数变量布局小结

    把布局作为一种信仰(Layout as Religion).                                                                       ...

  7. Git使用相关

    Git使用相关 使用git这么久还是时不时碰到小问题,根本原因在于没有仔细研究和做笔记 Git修改remote地址 之前一直使用的ssh的地址,估计是没配置好,每次都需要输密码烦死了,今天看到个用ht ...

  8. [java] 汇率换算器实现(1)

    [java] 汇率换算器实现(1) // */ // ]]>   [java] 汇率换算器实现(1) Table of Contents 1 问题描述 2 类设计 3 初步实现 3.1 建立项目 ...

  9. 【译】使用UIKit进行面向对象的编程

    在WWDC 2015上,Apple谈了Swift中面向协议编程的话题,令人深思.在那之后,好像每个人都在讨论关于协议扩展的话题,这个新的语言特性使每个人都有所困惑. 我阅读了许多关于Swift中协议的 ...

随机推荐

  1. C#如何消除绘制图形缩放时抖动,总结

    一.手动双缓冲 首先定义一个BitmapBitmap backBuffer = new Bitmap(画布宽度, 画布高度);然后获取这个Bitmap的GraphicsGraphics graphic ...

  2. leetcode558

    """ # Definition for a QuadTree node. class Node(object): def __init__(self, val, isL ...

  3. atl控件发布打包<转>

    http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html ActiveX打包与发布 在VS2005或VS2008安装后发现路径* ...

  4. ffmpeg源码分析一:概述 (转1)

    原帖地址:http://blog.csdn.net/austinblog/article/details/24800381 首先先看ffmpeg.c文件,有类似于如下的一些变量: InputStrea ...

  5. python算法之快速排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...

  6. Windows Ruby 安装步骤

    by 狂奔的蜗牛的博客 from http://www.host900.com/ 本文地址:http://www.host900.com/index.php/articles/285/ Windows ...

  7. python gun readline

    https://github.com/ludwigschwardt/python-gnureadline

  8. 使用CMD命令行来对MySQL数据库执行迁移、备份、恢复

    1. 导出数据库数据   "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqldump.exe" -u root -p123abc ...

  9. windows下python安装Numpy和Scipy模块

    安装 numpy: 去 http://sourceforge.net/projects/numpy/files/latest/download?source=files 下载相应的exe安装文件. 安 ...

  10. android-tip-各种clock的使用

    参考:http://developer.android.com/reference/android/os/SystemClock.html  System.currentTimeMills() 这个函 ...