探索Vue高阶组件的使用
高阶组件(HOC)是React生态系统的常用词汇,React中代码复用的主要方式就是使用高阶组件,并且这也是官方推荐的做法。而Vue中复用代码的主要方式是使用mixins,并且在Vue中很少提到高阶组件的概念,这是因为在Vue中实现高阶组件并不像React中那样简单,原因在于React和Vue的设计思想不同,但并不是说在Vue中就不能使用高阶组件,只不过在Vue中使用高阶组件所带来的收益相对于mixins并没有质的变化。本篇文章主要从技术性的角度阐述Vue高阶组件的实现,且会从React与Vue两者的角度进行分析。
从React说起
起初React也是使用mixins来完成代码复用的,比如为了避免组件不必要的重复渲染我们可以在组件中混入PureRenderMixin:
constPureRenderMixin=require('react-addons-pure-render-mixin') constMyComponent=React.createClass({ mixins:[PureRenderMixin] })
后来React抛弃了这种方式,进而使用shallowCompare:
constshallowCompare=require('react-addons-shallow-compare') constButton=React.createClass({ shouldComponentUpdate:function(nextProps,nextState){ returnshallowCompare(this,nextProps,nextState); } })
这需要你自己在组件中实现shouldComponentUpdate方法,只不过这个方法具体的工作由shallowCompare帮你完成,即浅比较。
再后来React为了避免开发者在组件中总是要写这样一段同样的代码,进而推荐使用React.PureComponent,总之React在一步步的脱离mixins,他们认为mixins在React生态系统中并不是一种好的模式(注意:并没有说mixins不好,仅仅针对React生态系统),观点如下:
1、mixins带来了隐式依赖
2、mixins与mixins之间,mixins与组件之间容易导致命名冲突
3、由于mixins是侵入式的,它改变了原组件,所以修改mixins等于修改原组件,随着需求的增长mixins将变得复杂,导致滚雪球的复杂性。
具体大家可以查看这篇文章MixinsConsideredHarmful。不过HOC也并不是银弹,它自然带来了它的问题,其观点是:使用普通组件配合renderprop可以做任何HOC能做的事情。
本篇文章不会过多讨论mixins和HOC谁好谁坏,就像技术本身就没有好坏之分,只有适合不适合。难道React和Vue这俩哥们儿不也是这样吗