(积累)ReactJS一些有趣的地方
2016-03-25 17:09
549 查看
生命周期
贴一个简单的代码var A = React.createClass({ loadFromServer() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { console.log("A loaded getData"); this.setState({data: data}); console.log("A loaded setData"); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, componentDidMount() { console.log("A DidMount load before"); this.loadFromServer(); console.log("A DidMount load after"); }, componentWillMount() { console.log("A WillMount"); }, render() { console.log("A render"); return ( <B /> ); } )}; var B = React.createClass({ loadFromServer() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { console.log("B loaded getData"); this.setState({data: data}); console.log("B loaded setData"); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, componentDidMount() { console.log("B DidMount load before"); this.loadFromServer(); console.log("B DidMount load after"); }, componentWillMount() { console.log("B WillMount"); }, render() { console.log("B render"); return ( <div></div> ); } }); var C = React.createClass({ loadServer() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { console.log("C loaded getData"); this.setState({data: data}); console.log("C loaded setData"); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, componentDidMount() { console.log("C DidMount load before"); this.loadServer(); console.log("C DidMount load after"); }, componentWillMount() { console.log("C WillMount"); }, render() { console.log("C render"); return ( <div></div> ); } });
console输出为
A WillMount A render B WillMount B render C WillMount C render C DidMount load before C DidMount load after B DidMount load before B DidMount load after A DidMount load before A DidMount load after C loaded getData C render C loaded setData B loaded getData B render C render B loaded setData A loaded getData A render B render C render A loaded setData
componentDidMount很明显的自下向上运行,有趣的一点,setState会立即更新自身及其子类的render然后才执行下一行的console.log,在另一个代码中我尝试26个英文字母的26层嵌套,loaded getData总是在componentDidMount全部执行后才输出,因此可以认为ajax的异步读取(至少success里的)总是要在componentDidMount全部执行后才调用,因此是否所有的服务器数据读取总是要在componentDidMount全部执行后才执行呢,明天或者后天再尝试一下
相关文章推荐
- React(0.13) 定义一个使用动画
- react-native开源组件react-native-wechat学习
- react-native开源组件react-native-wechat学习
- React-Native 学习笔记
- 最快让你上手ReactiveCocoa之基础篇
- React(0.13) 定义一个checked组件
- React(0.13) 定义一个多选的组件
- 【长篇高能】ReactiveCocoa 和 MVVM 入门
- React(0.13) 定义一个input组件,使其输入的值转为大写
- React Native第1天——环境配置及知识体系
- React Native 环境配置
- react、redux什么的都用起来 【3】穿越spa的路由
- react.js学习(1) webpack
- React Native平台与Android本地模块之间的调用
- 最快让你上手ReactiveCocoa之基础篇
- ReactiveCocoa 函数响应式编程简介 链式编程 函数式编程 响应式编程
- RAC(ReactiveCocoa)
- React Native 简介
- Reactive Programming with RxJS (读书笔记)
- React Native ios 设置状态栏文本颜色