react setState里的作用域
从接触racet开始,我们就认识了setState,它是对全局变量进去更新的一个重要方法,
不仅可以更新数据,还能在更新后执行方法时直接调用刚刚更新的数据
今天碰到的问题就在于它的作用域的先后问题
先看一段代码
let productList = React.createClass({
mixins: [LoadingMixin,NotificationMixin,RequestMixin],
getInitialState(){
return {
data: [],
param:{}
pagination: {showQuickJumper: true,showTotal: total => `共 ${total} 条`},
}
},
componentWillMount() {
let param = {}
param.shopid = '1'
this.setState({
param: param,
},this.fetch());
},
fetch(pageNum = 1, pageSize = 10) {
this.get({
url: "Api/lists/*************f4bac",
param: {
shopid:this.state.param && this.state.param.shopid || '',
p: pageNum,
n: pageSize
},
noLoading: true
}).then(result=> {
const pagination = this.state.pagination;
pagination.total = Number(result.count);
this.setState({data: result.result || [],oldData: result.result || []});
});
},
render() {
const { getFieldDecorator } = this.props.form;
let statusObj = {
1: "有效",
2: "无效"
};
let needLoginObj = {
1: "会员",
2: "普通"
};
let needNetObj = {
1: "外网",
2: "本地"
};
let columns = [
{ title: '编号',dataIndex: 'id', key: 'id', width: '6%'},
{ title: '图标', dataIndex: 'icon', key: 'icon', width: '9%' ,
render: (text, record) => {
return (
text ? <img style={{width: "50px",height: "50px"}} src={text} /> : <div></div>
)
}
},
{ title: '分类名称', dataIndex: 'classid', key: 'classid', width: '10%',
render: (text, record) => {
return (this.state.gameClassObj[text])
}
},
{ title: '游戏名称', dataIndex: 'title', key: 'title', width: '10%' },
{ title: '游戏地址', dataIndex: 'gameurl', key: 'gameurl', width: '15%' },
{ title: '是否外网', dataIndex: 'neednet', key: 'neednet', width: '10%',
render: (text, record) => {
return (needNetObj[text])
}
},
{ title: '类别', dataIndex: 'needlogin', key: 'needlogin', width: '10%',
render: (text, record) => {
return (needLoginObj[text])
}
},
{ title: '排序', dataIndex: 'no', key: 'no', width: '8%' },
{ title: '状态', dataIndex: 'state', key: 'state', width: '8%',
render: (text, record) => {
return (
statusObj[record["state"]]
)
}
},
{ title: '操作', key: '#', width: '14%',
render: (text, record) => {
return (
<div>
<Button type="primary" onClick={this.addOrUpdate.bind(this,record)}>修改</Button>
<Popconfirm placement="topRight" title={"您确定要删除该数据吗?"} onConfirm={this.handleClose.bind(this,record)} okText="确定" cancelText="取消">
<Button type="primary" >删除</Button>
</Popconfirm>
</div>
)
}
}
];
return (
<div className="modular-main">
<div className="title">
<h2>游戏列表</h2>
</div>
<div>
<Table columns={columns}
dataSource={this.state.data}
pagination ={false}
scroll={{ y: 600 }}
rowKey={(record) => record.id}
>
</Table>
</div>
</div>
)
}
});
productList = createForm()(productList);
export default productList;
以上代码看似毫无问题,但实际上fetch方法中的请求参数shopid永远也收不到值 ,这是为什么呢
this.setState({
param: param,
},this.fetch());
this.setState({
param: param,
},this.fetch);
其实问题就在this.fetch()中的()上
查阅资料后才知道,在react的生命周期componentWillMount里,带()的方法会被优先执行,而在setState的作用域还没起作用的时候,this.fetch()就已经开始执行了,所以this.fetch()的参数永远也不会有值
而且我们要解决它也很简单,去掉()就行啦
react setState里的作用域的更多相关文章
- 动态修改JS对象的值及React setState
一.在JS里使用(非ES6) 实现场景: 给一个空对象填充某一指定数组内的值 并随机生成数量 const fruit = ['apple', 'banana', 'orange'] let fruit ...
- 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let
转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...
- React/Vue里的key到底有什么用?看完这篇你就知道了!(附demo代码)
网上有很多博客讲到,React.Vue里的key,与 Virtual DOM 及 DOM diff 有关, 可以用来唯一标识DOM节点,提高diff效率,云云. 这大致是对的,但是,大多讲得语焉不详, ...
- 深入研究React setState的工作机制
前言 上个月发表了一篇 React源码学习--ReactClass,但是后来我发现,大家对这种大量贴代码分析源码的形式并不感冒.讲道理,我自己看着也烦,还不如自己直接去翻源码来得痛快.吸取了上一次的教 ...
- [Web 前端] 我不再使用React.setState的3个原因
copy from : https://blog.csdn.net/smk108/article/details/85237838 从几个月前开始,我在新开发的React组件中不再使用setState ...
- 关于React setState的实现原理(二)
React中的Transaction 大家学过sql server的都知道我们可以批量处理sql语句,原理其实都是基于上一篇我们说的Datch Update机制.当所有的操作均执行成功,才会执行修改操 ...
- 关于React setState的实现原理(三)
前面提到事务即将结束时,会去调用FLUSH_BATCHED_UPDATES的flushBatchedUpdates方法执行批量更新,该方法会去遍历dirtyComponents,对每一项执行perfo ...
- 关于React setState的实现原理(一)
前言 首先在学习react的时候就对setSate的实现有比较浓厚的兴趣,那么对于下边的代码,可以快速回答吗? class Root extends React.Component { constru ...
- react setState修改嵌套对象
在react使用setState过程中,难免会遇到复杂的数据类型,,这里还要提醒一下setState 是异步操作行为,需要setState之后的结果做为参数,请求数据的话,可以配合 async aw ...
随机推荐
- redis系列文章目录
redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内存 Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储] ...
- 《Cracking the Coding Interview》——第13章:C和C++——题目6
2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构 ...
- 如何将现有的项目添加到远程的git库里面!
我们经常都会遇到这样的场景,就是将本地的一个项目同步到网上远程的git库里面.最近也遇到这样的问题,发现网上很少人讲到这个问题,但是这个问题是很多程序员遇到的版本库管理的最早的拦路虎. 我的远程是ht ...
- Python 实现MD5加密
from hashlib import md5 def encrypt_md5(s): # 创建md5对象 new_md5 = md5() # 这里必须用encode()函数对字符串进行编码,不然会报 ...
- Oracle数据库存量数据抽取使用spool控制命令
spool是oracle sqlplus提供的一个控制命令.可以利用spool和select语句的组合动态生成一些失去了脚本或者一些数据. 1.spool作用: 在sqlplus中用来保存或打印查询 ...
- Wordpress 后台文章编辑区添加模板选择功能
功能:后台编辑文章时,可以选择文章使用的模板,效果如下图: 操作步骤: <?php /** * Template Name: kbsingle full * Add by Ryan 3/18/2 ...
- linux备忘录-文件系统管理
Extx 文件系统原理 block group 每个分区(partition)的组成为 boot sector -> block group -> block group -> bl ...
- Java获取当前服务器IP实现
package hope.ipaddress.demo; import java.net.InetAddress; import java.net.NetworkInterface; import j ...
- 如何实现自己的Android MVP框架?
相信熟悉android开发的童鞋对MVP框架应该都不陌生吧,网上很多关于android中实现MVP的文章,大家可以直接搜索学习.这些文章中,MVP的实现思路基本都是把Activity.Fragment ...
- 【Luogu】P3760异或和(权值树状数组)
题目链接 再次声明以后我见到位运算一定第一时间想把它拆成每一位算 本题就是有个前缀和sum[],然后让你求每一位有多少对i,j满足sum[i]-sum[j]在那一位上是1 考虑怎样才能减出1来 如果s ...