对React一些原理的理解
前言随着项目开发的深入,不可避免了遇到了一些问题。刚开始出现问题时很懵,不知道该怎么解决,原因就是对React的原理理解的不够透彻,不知道问题出在哪。在解决问题的过程中,也逐渐深入了解了React的一些原理,这篇文章就来分享一下我对React一些原理的理解。
概述本文是《使用React技术栈的一些收获》系列文章的第二篇(第一篇在这里,介绍如何开始构建React大型项目),简单介绍了React一些原理,包括React合成事件系统、组件的生命周期以及 React合成事件系统React快速的原因之一就是React很少直接操作DOM,浏览器事件也是一样。原因是太多的浏览器事件会占用很大内存。 React为此自己实现了一套合成系统,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑,最大化解决浏览器兼容问题。 其基本原理就是,所有在JSX声明的事件都会被委托在顶层document节点上,并根据事件名和组件名存储回调函数( 因此,如果你采用下面这种写法,并且这样的P标签有很多个: listView = list.map((item,index) => { return ( <p onClick={this.handleClick} key={item.id}>{item.text}</p> ) }) That's OK,React帮你实现了 由于React合成事件系统模拟事件冒泡的方法是构建一个自己及父组件队列,因此也带来一个问题,合成事件不能阻止原生事件,原生事件可以阻止合成事件。用 如果你想详细了解React合成事件系统,移步http://blog.csdn.net/u0135108... 组件的生命周期(以父子组件为例)为了搞清楚组件生命周期,构造一个父组件包含子组件并且重写各生命周期函数的场景: class Child extends React.Component { constructor() { super() console.log('Child was created!') } componentWillMount(){ console.log('Child componentWillMount!') } componentDidMount(){ console.log('Child componentDidMount!') } componentWillReceiveProps(nextProps){ console.log('Child componentWillReceiveProps:'+nextProps.data ) } shouldComponentUpdate(nextProps,nextState){ console.log('Child shouldComponentUpdate:'+ nextProps.data) return true } componentWillUpdate(nextProps,nextState){ console.log('Child componentWillUpdate:'+ nextProps.data) } componentDidUpdate(){ console.log('Child componentDidUpdate') } render() { console.log('render Child!') return ( <h1>Child recieve props: {this.props.data}</h1> ); } } class Father extends React.Component { // ... 前面跟子组件一样 handleChangeState(){ this.setState({randomData: Math.floor(Math.random()*50)}) } render() { console.log('render Father!') return ( <div> <Child data={this.state.randomData} /> <h1>Father State: { this.state.randomData}</h1> <button onClick={this.handleChangeState}>切换状态</button> </div> ); } } React.render( <Father />,document.getElementById('root') ); 结果如下: 调用父组件的setState后: 在Jsbin上试试看 有一张图能说明这之间的流程(图片来源): setState并不奇怪有一个能反映问题的场景: ... state = { count: 0 } componentDidMount() { this.setState({count: this.state.count + 1}) this.setState({count: this.state.count + 1}) this.setState({count: this.state.count + 1}) } ... 看起来state.count被增加了三次,但结果是增加了一次。这并不奇怪: React快的原因之一就是,在执行
那么调用 这之间发生了什么? 开发人员对
... state = { score: 0 } componentDidMount() { this.setState( (prevState) => ({score : prevState.score + 1}) ) this.setState( (prevState) => ({score : prevState.score + 1}) ) this.setState( (prevState) => ({score : prevState.score + 1}) ) } } 这个 你会发现达到增加三次的目的了: 在Jsbin上试试看 这是因为React会把 另外,不知道你在jsbin上的代码上注意到没有,调用 总结学习一个框架或者工具,我觉得应该了解以下几点:
通过对React一些原理的简单了解,就懂得了React为什么这么快速的原因之一,也会在问题出现时知道错在什么地方,知道合理的解决方案。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |