很多人看到高阶组件(
HOC
)这个概念就被吓到了,认为这东西很难,其实这东西概念真的很简单,我们先来看一个例子。
function add(a, b) {
return a + b
}
现在如果我想给这个
add
函数添加一个输出结果的功能,那么你可能会考虑我直接使用console.log
不就实现了么。说的没错,但是如果我们想做的更加优雅并且容易复用和扩展,我们可以这样去做
function withLog (fn) {
function wrapper(a, b) {
const result = fn(a, b)
console.log(result)
return result
}
return wrapper
}
const withLogAdd = withLog(add)
withLogAdd(1, 2)
- 其实这个做法在函数式编程里称之为高阶函数,大家都知道
React
的思想中是存在函数式编程的,高阶组件和高阶函数就是同一个东西。我们实现一个函数,传入一个组件,然后在函数内部再实现一个函数去扩展传入的组件,最后返回一个新的组件,这就是高阶组件的概念,作用就是为了更好的复用代码。 - 其实
HOC
和Vue
中的mixins
作用是一致的,并且在早期React
也是使用mixins
的方式。但是在使用class
的方式创建组件以后,mixins
的方式就不能使用了,并且其实mixins
也是存在一些问题的,比如
1.隐含了一些依赖,比如我在组件中写了某个 state
并且在 mixin
中使用了,就这存在了一个依赖关系。万一下次别人要移除它,就得去 mixin
中查找依赖
2.多个 mixin
中可能存在相同命名的函数,同时代码组件中也不能出现相同命名的函数,否则就是重写了,其实我一直觉得命名真的是一件麻烦事。。
3.雪球效应,虽然我一个组件还是使用着同一个 mixin
,但是一个 mixin
会被多个组件使用,可能会存在需求使得 mixin
修改原本的函数或者新增更多的函数,这样可能就会产生一个维护成本
HOC
解决了这些问题,并且它们达成的效果也是一致的,同时也更加的政治正确(毕竟更加函数式了)