从接触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里的作用域的更多相关文章

  1. 动态修改JS对象的值及React setState

    一.在JS里使用(非ES6) 实现场景: 给一个空对象填充某一指定数组内的值 并随机生成数量 const fruit = ['apple', 'banana', 'orange'] let fruit ...

  2. 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let

    转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...

  3. React/Vue里的key到底有什么用?看完这篇你就知道了!(附demo代码)

    网上有很多博客讲到,React.Vue里的key,与 Virtual DOM 及 DOM diff 有关, 可以用来唯一标识DOM节点,提高diff效率,云云. 这大致是对的,但是,大多讲得语焉不详, ...

  4. 深入研究React setState的工作机制

    前言 上个月发表了一篇 React源码学习--ReactClass,但是后来我发现,大家对这种大量贴代码分析源码的形式并不感冒.讲道理,我自己看着也烦,还不如自己直接去翻源码来得痛快.吸取了上一次的教 ...

  5. [Web 前端] 我不再使用React.setState的3个原因

    copy from : https://blog.csdn.net/smk108/article/details/85237838 从几个月前开始,我在新开发的React组件中不再使用setState ...

  6. 关于React setState的实现原理(二)

    React中的Transaction 大家学过sql server的都知道我们可以批量处理sql语句,原理其实都是基于上一篇我们说的Datch Update机制.当所有的操作均执行成功,才会执行修改操 ...

  7. 关于React setState的实现原理(三)

    前面提到事务即将结束时,会去调用FLUSH_BATCHED_UPDATES的flushBatchedUpdates方法执行批量更新,该方法会去遍历dirtyComponents,对每一项执行perfo ...

  8. 关于React setState的实现原理(一)

    前言 首先在学习react的时候就对setSate的实现有比较浓厚的兴趣,那么对于下边的代码,可以快速回答吗? class Root extends React.Component { constru ...

  9. react setState修改嵌套对象

    在react使用setState过程中,难免会遇到复杂的数据类型,,这里还要提醒一下setState 是异步操作行为,需要setState之后的结果做为参数,请求数据的话,可以配合 async  aw ...

随机推荐

  1. luogu3343 [ZJOI2015]地震后的幻想乡

    ref 前置技能是bzoj的串珠子.这种子集dp好神啊qwq. 还有这种钦定点转移子集的方法建议按这题的方法写,不要看串珠子qwq #include <iostream> #include ...

  2. 《Cracking the Coding Interview》——第12章:测试——题目3

    2014-04-24 23:28 题目:玩象棋游戏,你要设计一个bool型的方法来检测一个棋子能否移动到指定位置. 解法:不同的棋子有不同的移动规则,那么应该采取棋子基类实现接口,各个棋子子类来实现的 ...

  3. 《Cracking the Coding Interview》——第6章:智力题——题目5

    2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...

  4. HDU 4731 Minimum palindrome (找规律)

    M=1:aaaaaaaa…… M=2:DFS+manacher, 暴出N=1~25的最优解,找规律.N<=8的时候直接输出,N>8时,头两个字母一定是aa,剩下的以aababb循环,最后剩 ...

  5. [译]如何去除pandas dataframe里面的Unnamed的列?

    原文来源: https://stackoverflow.com/questions/43983622/remove-unnamed-columns-in-pandas-dataframe 问:我有一个 ...

  6. [转] mysql分区性能初探

    本文转自:http://www.cnblogs.com/acpp/archive/2010/08/09/1795464.html 一,      分区概念  分区允许根据指定的规则,跨文件系统分配单个 ...

  7. 使用common-fileUpload实现文件上传

    通过common-fileUpload文件上传组件,可以实现上传文档.图片等资料.根据程序的不同要求,它可以有多种方式的应用. 我们这里介绍一种简单的例子,来实现文件上传功能. 准备: 引入相关组建的 ...

  8. Rational Rose 使用技巧

    1.浏览区 2.菜单项 其中Format选项中: 决定各项是否显示,也可以通过右击-option选择 3.常用快捷键: F1:任何时候都可以按F1获得相关帮助,把鼠标放在某条菜单上按F1可以获得这条菜 ...

  9. hdu 1007 Quoit Design (最近点对问题)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...