关于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呢?
改进一:
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> 点击</div>
</div>
}
/>
</Card>
</a>
</List.Item>
)}
/>
)
}
}
缺陷:点击加载更多会闪一下,因为render会走两遍,第一遍是加载中,return null
关于Relay的麻烦之处的更多相关文章
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- 前馈网络求导概论(一)·Softmax篇
Softmax是啥? Hopfield网络的能量观点 1982年的Hopfiled网络首次将统计物理学的能量观点引入到神经网络中, 将神经网络的全局最小值求解,近似认为是求解热力学系统的能量最低点(最 ...
- Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
- 更好的pip工作流
转自:http://codingpy.com/article/a-better-pip-workflow-recommended-by-kenneth/ 现在大家开发Python应用时,在代码库的根目 ...
- [转]passport.js学习笔记
概述 passport.js是Nodejs中的一个做登录验证的中间件,极其灵活和模块化,并且可与Express.Sails等Web框架无缝集成.Passport功能单一,即只能做登录验证,但非常强大, ...
- C++中函数变量布局小结
把布局作为一种信仰(Layout as Religion). ...
- Git使用相关
Git使用相关 使用git这么久还是时不时碰到小问题,根本原因在于没有仔细研究和做笔记 Git修改remote地址 之前一直使用的ssh的地址,估计是没配置好,每次都需要输密码烦死了,今天看到个用ht ...
- [java] 汇率换算器实现(1)
[java] 汇率换算器实现(1) // */ // ]]> [java] 汇率换算器实现(1) Table of Contents 1 问题描述 2 类设计 3 初步实现 3.1 建立项目 ...
- 【译】使用UIKit进行面向对象的编程
在WWDC 2015上,Apple谈了Swift中面向协议编程的话题,令人深思.在那之后,好像每个人都在讨论关于协议扩展的话题,这个新的语言特性使每个人都有所困惑. 我阅读了许多关于Swift中协议的 ...
随机推荐
- 跟我学算法聚类(DBSCAN)
DBSCAN 是一种基于密度的分类方法 若一个点的密度达到算法设定的阖值则其为核心点(即R领域内点的数量不小于minPts) 所以对于DBSCAN需要设定的参数为两个半径和minPts 我们以一个啤酒 ...
- xmlhttp的OnReadyStateChange事件
这两天抽空升级了一下自己做的pon资料表,增加了OLT拓扑自动发现以及业务从MSE至OLT的全自动下发 等功能,让人没想到的是在处理xmlhttp回调时死活接收不到反馈信息, 在Excel论坛和微软官 ...
- ros ddns
ROS5X-6X脚本(10-15分钟执行一次) #DDNS本站帐号 :global ddnsuser "用户名" #DDNS本站密码 :global ddnspass " ...
- ZPP002M可重复执行
AutoOutToSAP一直未回写完成,查看得知最后一步执行时间超长, stop job ZPP002M可重复执行
- Kafka如何保证数据不丢失
Kafka如何保证数据不丢失 1.生产者数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到,其中状态有0,1,-1. 如果是 ...
- Invoke and BeginInvoke(转载:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html)
一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己. 1 ...
- 88. Merge Sorted Array (Array)
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...
- Cocoapods 版本升级
和往常一样使用 Cocoapods ,执行命令: $ pod install #输出信息 /System/Library/Frameworks/Ruby.framework/Versions/2.0/ ...
- Linux Bash脚本编程语言中的美学与哲学
我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨Bash脚本语言中的美学与哲学. 这不是一篇Bash脚本编程的教程,但是却能让人更加深入地了解Bash脚本编程,更 ...
- Linux buffer and cache
A buffer is something that has yet to be "written" to disk. A cache is something that has ...