You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在平时写代码中,在render没有非常大的开销情况下(也没有依赖组件的某些属性进行性能优化、没使用 pureComponent), 会优先使用纯内联的写法(无论是函数组件还是 class 组件)。因为重新创建函数开销我觉得不是特别大的,并且内联我觉得还有最大的好处就是,看到一个事件调用,不需要再点到事件函数调用的地方...减少了飞来飞去的情况,而且上面也提到,内联传递参数是非常方便的。在实在遇到性能问题,再考虑优化。无需为了优化而优化
带你找出
react
中,回调函数绑定this
最完美的写法!(文末 有惊喜)在我看来,有若干种
this
写法,我们通过本文,一步步找优缺点,筛选出最完美的react
this
写法!(有点小激动)1、远古时代
React.createClass
说实话,在我接触
react
的时候,这种写法就只在相关文章见到了。React.createClass
会自动绑定所有函数的this
到组件上react 0.13
开始就已经支持class
声明组件了。react 16
已经废弃了这种写法,这里就不讨论了。直接淘汰2、错误示范
这种写法,最终打印
this
是指向undefined
。原因在于上面的事件绑定函数调用可以看作如下。在
onClick
进行调用时,this
的上下文是全局,由于是在es module
中,全局this
指向undefined
,所以这个错误示范的事件处理函数中的this
不是指向组件本身的3、利用
proposal-class-public-fields
直接绑定箭头函数经过
babel
转换,等价于以下的代码可以看出,
3
和2
从最大的区别在于,3
将fn
直接绑定在实例的属性上(2
是绑定在原型的方法上),并利用箭头函数继承父级this
作用域达到了this
绑定的效果。优点:代码十分简洁,不需要手动写
bind
、也不需要在constructor
中进行额外的操作缺点:很多文章都提到这是一种完美写法,但其实每一个实例在初始化的时候都会新建一个新事件回调函数(因为绑定在实例的属性上,每个实例都有一个
fn
的方法。本质上,这是一种重复浪费),所以其实并不是很完美4、
Constructor
中使用 bind优点:几乎等价于3
缺点:代码写起来比较繁琐,需要在
constructor
中,手动绑定每一个回调函数5、在
render
中进行bind
绑定优点:
fn
函数多次实例化只生成一次,存在类的属性上,类似于4
,写法上比4
稍微好一点。缺点:
this.fn.bind(this)
会导致每次渲染都是一个全新的函数,在使用了组件依赖属性进行比较、pureComponent
、函数组件React.memo
的时候会失效。最关键的是
5
的写法会被6
全方面吊打完爆6、箭头函数内联写法
优点:
1、写法简洁
2、与
2-5
的写法相比,6
写法最大的最大好处就是传参灵活3、全面吊打写法
4
,相同的缺点,但是多了传参数灵活。如果需要渲染一个数组,并且数组根据不同项,事件处理不一样时,2-5
就很尴尬了网上看多文章都在使用
3
的方案的时候推荐使用闭包传参实现该效果经过前面的分析。使用这种写法,还不如直接使用
6
的内联写法,两种每次都是返回全新的函数,而且,少了一次返回闭包函数的开销。缺点: 每次渲染都是一个全新的函数,类似于
5
的缺点,在使用了组件依赖属性进行比较、pureComponent
、函数组件React.memo
的时候会失效7、函数组件的
useCallback
虽然函数组件无
this
一说法,但既然讲到react
回调函数,还是提一下在
hook
出现之前,函数组件是不能保证每次的回调函数都是同一个的,(虽然可以把回调提到函数作用域外固定,但都是一些 hack 的方法了)有了
hook
。我们便可以使用useCallback
固定住回调有没有发现。其实很类似
class
组件的将回调挂在class
上,嗯,这就hook
强大的地方,利用了react fiber
,挂在了它的memorizeState
上,实现了能在多次渲染中保持(这就不展开讲了)。缺点还是和上面提过的,参数传递不方便,如渲染数组8、
(最完美)
的写法?当然,如果不使用内联写法又获取到参数行不行呢。当然也是可以的,利用元素的自定义属性
data-
属性传递参数orz! 这是最完美写法了吧!不考虑代码繁琐的情况下,既正确绑定了
this
,又不会多次实例化函数,又能渲染数组。。其实还是错误的...
data-xxx
属性只能传递string
类型的数据,因为是附加给html
的,react
会进行一步JSON.stringify
的操作,如果你传递一个对象,打印出来是value: "[object Object]"
。果然,就算是为了获取字符串参数,也不推荐这种写法。可以,但没必要!9、最省事的写法?
有一位大佬写了一个 babel 插件babel-plugin-react-scope-binding的插件,能够实现 将
2
的错误示范自动转化内联函数,更牛逼的是还能传参。介绍。确实是最省事的写法,不过很容易引起歧义,也有上面提到的问题好吧,感谢你看到这里,废话连篇一篇文章,其实似乎并没有找回完美的写法。。。
下面说说本人的一些愚见吧
在平时写代码中,在
render
没有非常大的开销情况下(也没有依赖组件的某些属性进行性能优化、没使用 pureComponent), 会优先使用纯内联的写法(无论是函数组件还是 class 组件)。因为重新创建函数开销我觉得不是特别大的,并且内联我觉得还有最大的好处就是,看到一个事件调用,不需要再点到事件函数调用的地方...减少了飞来飞去的情况,而且上面也提到,内联传递参数是非常方便的。在实在遇到性能问题,再考虑优化。无需为了优化而优化最近春招季,看完这篇文章,虽然还是找不出最完美的
react
绑定事件写法,但是面试官提起react
绑定事件的几种区别时,相信大家都能答出来了。。。。The text was updated successfully, but these errors were encountered: