从接触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. 容器技术的落地还要依靠SDN

    容器能够实现新应用程序的快速部署,代表着目前IT开发社区的最热门趋势之一.然而,想要实现容器部署生产环境,IT人员还需要使用SDN技术,在分布式微应用程序之间实现可扩展.可管理且安全的通信. 什么是容 ...

  2. Android学习记录(3)—Android中ContentProvider的基本原理学习总结

    一.ContentProvider简介        当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...

  3. Pascal小游戏 双人射击

    一个双人的游戏 Pascal源码附上 只要俩人不脑残,一下午玩不完...又是控制台游戏中的一朵奇葩. Free Pascal 射击游戏 Program shooting_game; uses crt; ...

  4. 用gulp清除、移动、压缩、合并、替换代码

    之前前端代码部署时用的是grunt,后来又出了个gulp工具,最近试用了一下,很方便,感觉比grunt简单好用,下面把一些常见的任务列一下,备用. var gulp = require('gulp') ...

  5. Windows Server 2008 R2 集群(OpenService “RemoteRegistry” 失败)笔记

    OpenService “RemoteRegistry” 失败. 我在创建验证域控服务器[系统]类别中 看到错误日志 我在域控服务器去看,在 computers 里面 是有这台 计算机,但是为什么不行 ...

  6. Python SimpleHTTPServer简单HTTP服务器

    搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享.但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方.比如你想快速共享Linux系统的某个目录给整个项目 ...

  7. 孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  8. Ubuntu16.04 问题汇总

    Ubuntu16.04安装wps并解决系统缺失字体问题 http://www.cnblogs.com/liutongqing/p/6388160.html

  9. 1099 Build A Binary Search Tree (30 分)(查找二叉树)

    还是中序遍历建树 #include<bits/stdc++.h> using namespace std; ; struct node { int data; int L,R; }s[N] ...

  10. springmvc maven搭建一

    一.标题:使用maven搭建一个简单的web工程 二.涉及工具:Eclipse.maven.tomcat8.0.jdk1.8 三.操作: 完善项目:增加src/main/java,src/test/r ...