内容简介:在react中实现事件处理,有多种写法,那那种写法相对更优,更利于React的渲染性能呢?使用class fields语法(上表中我们看到,在render中直接bind或者箭头函数都会影响性能,原因在于,在render 中的bind和箭头函数在每次render时都会创建新的函数,导致子组件的props发生改变,这在PureComponent中会影响性能,除非自己在shouldComponentUpdate中进行优化。
在react中实现事件处理,有多种写法,那那种写法相对更优,更利于React的渲染性能呢?
React组件中添加事件处理的几种方式
constructor函数中bind
class ReactEvent extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Click');
}
render() {
return <button onClick={this.handleClick}>Click Me</button>;
}
}
使用箭头函数(实验语法,尚未标准化)
render中使用箭头函数
class ReactEvent extends Component {
handleClick() {
console.log('Click');
}
render() {
return <button onClick={() => this.handleClick()}>Click Me</button>;
}
}
使用class fields语法( https://babeljs.io/docs/en/ba... )
class ReactEvent extends Component {
//此函数会被绑定到ReactEvent类的实例
handleClick = () => {
console.log('Click');
}
render() {
return <button onClick={this.handleClick}>Click Me</button>;
}
}
在render中使用bind
class ReactEvent extends Component {
handleClick() {
console.log('Click');
}
render() {
return <button onClick={this.handleClick.bind(this)}>Click Me</button>;
}
}
几种方式比较
| 影响 | constructor函数中bind | 使用class fields语法 | render中使用箭头函数 | 在render中使用bind |
|---|---|---|---|---|
| render时生成新函数 | 否 | 否 | 是 | 是 |
| 性能 | 无影响 | 无影响 | 有影响 | 有影响 |
| 可直接携带参数 | 否 | 否 | 是 | 是 |
| 简洁性 | 不好 | 好 | 好 | 好 |
上表中我们看到,在render中直接bind或者箭头函数都会影响性能,原因在于,在render 中的bind和箭头函数在每次render时都会创建新的函数,导致子组件的props发生改变,这在PureComponent中会影响性能,除非自己在shouldComponentUpdate中进行优化。
//仅作为示例代码,不遵循常用代码规范
//子组件
class Button extends React.PureComponent {
render() {
console.log('================')
return (
<button onClick={this.props.handleClick}>hahaha</button>
)
}
}
//父组件
class ButtonList extends React.Component {
constructor(props) {
super(props);
this.state = {
index: -1,
list: [1, 2, 3, 4]
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Click');
}
onStateChange = () => {
this.setState({
index: 1
});
}
render() {
return (
<div>
<button onClick={this.onStateChange}>stateChange</button>
{
this.state.list.map(item => <Button handleClick={this.handleClick}/>)
}
</div>
)
}
}
ReactDOM.render(
<ButtonList />, document.getElementById('root')
);
事件处理中传参
在开发当中,经常遇到对一个列表做操作,可能包含删除,修改,查看。这时候绑定事件就需要传参,通常为id。
直接传递参数
//render中使用箭头函数
{
this.state.list.map(item => (
<Button onClick={() => this.handleClick(item.id)}/>
))
}
//render中使用bind
{
this.state.list.map(item => (
<Button onClick={this.handleClick.bind(this, item.id)}/>
))
}
使用data属性
//handleClick中通过e.target.dataset.id获取
{
this.state.list.map(item => (
<Button data-id={item.id} onClick={this.handleClick}/>
))
}
总结
这里不强制推荐使用哪一种,对于各个团队来说,可以根据项目,选择自己团队的事件绑定方式。
因为箭头函数的简洁性,在公司项目中,我们团队通常使用class fields 定义箭头函数来绑定事件。
当需要传参的时,单个参数传递使用data属性传参。
多个参数传递时,采用拆分子组件的方式回调传参。
//子组件
class Button extends React.PureComponent {
handleClick = () => {
this.props.handleClick(this.props.item);
}
render() {
return (
<button onClick={this.handleClick}>hahaha</button>
)
}
}
//父组件
class ButtonList extends React.Component {
constructor(props) {
super(props);
this.state = {
list: [1, 2, 3, 4]
};
}
handleClick = (item) => {
console.log('Click', item);
}
render() {
const { list=[] } = this.state;
return (
<div>
{
list.map(item => <Button handleClick={this.handleClick} item={item}/>)
}
</div>
)
}
}
ReactDOM.render(
<ButtonList />, document.getElementById('root')
);
结语
前端发展巨快,各种新特性,新框架,新UI层出不穷。需要我们不断保持学习,深挖技术底层,这样遇到任何新的技术,才能够以一法破万法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- React Hooks 源码解析(一):类组件、函数组件、纯组件
- react怎么知道是类组件还是函数组件
- 「React」函数组件于Class组件有何不同?
- 前端Vue:函数式组件
- React 是如果分辨函数式组件和类组件的?
- Vue 组件生命周期钩子函数
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解计算机系统(原书第2版)
(美)Randal E.Bryant、David O'Hallaron / 龚奕利、雷迎春 / 机械工业出版社 / 2011-1-1 / 99.00元
本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。 本书的最大优点是为程序......一起来看看 《深入理解计算机系统(原书第2版)》 这本书的介绍吧!