高阶函数在函数式编程中经常出现,就是你原本有一个函数,你可以通过另外一个函数进行包裹,这个新的函数既具有原来函数的功能,又可以添加自己的功能,这种方式称为高阶函数。
我们现在有一个函数组件Avatar
,它接收一个src属性并显示到img标签
上面是它的使用方式,可以看到我们使用的时候需要传递完整的图片地址,这很不方便。现在希望我们只需要传递用户名,就可以自动根据用户名查询到url。
这里我们使用高阶组件,创建一个函数组件withAvatarURL
,这个函数接收内部组件,本例中内部组件就是Avatar
,我们在外部函数中完成根据用户名查询头像地址,在内部函数组件Avatar
中实现渲染头像。
fetchURL
只是用来模拟网络请求的,我们设置0.5s后返回数据,Avatar
是基础组件,只负责把传入src属性显示到一个图片标签。
this.$attrs
用于获取组件所有属性,这是2.4之后才支持的功能,下面代码我们把高阶组件设置的属性传递给原始组件。
render (h) {
return h(InnerComponent, {
attrs: this.$attrs, // 2.4 only
props: {
src: this.url || 'http://via.placeholder.com/200x200'
}
})
}
高阶函数和mixin的选择
上面的demo同样可以使用mixin实现,但是高阶组件有如下优势