探索Vue高阶组件的使用

2020-06-16 06:24:45易采站长站整理
接收一个组件作为参数,返回一个新的组件 ,那么此时我们需要思考的是,在
Vue
中组件是什么?有的同学可能会有疑问,难道不是函数吗?对,
Vue
中组件是函数没有问题,不过那是最终结果,比如我们在单文件组件中的组件定义其实就是一个普通的选项对象,如下:


export default {
name: 'BaseComponent',
props: {...},
mixins: [...] methods: {...}
}

这不就是一个纯对象吗?所以当我们从单文件中导入一个组件的时候:


import BaseComponent from './base-component.vue'
console.log(BaseComponent)

思考一下,这里的

BaseComponent
是什么?它是函数吗?不是,虽然单文件组件会被
vue-loader
处理,但处理后的结果,也就是我们这里的
BaseComponent
仍然还是一个普通的 JSON 对象,只不过当你把这个对象注册为组件(
components
选项)之后,
Vue
最终会以该对象为参数创建一个构造函数,该构造函数就是生产组件实例的构造函数,所以在
Vue
中组件确实是函数,只不过那是最终结果罢了,在这之前我们完全可以说在
Vue
中组件也可以是一个普通对象,就像单文件组件中所导出的对象一样。

基于此,我们知道在

Vue
中一个组件可以以纯对象的形式存在,所以
Vue
中的高阶组件可以这样定义: 接收一个纯对象,并返回一个新的纯对象 ,如下代码:

hoc.js


export default function WithConsole (WrappedComponent) {
return {
template: '<wrapped v-on="$listeners" v-bind="$attrs"/>',
components: {
wrapped: WrappedComponent
},
mounted () {
console.log('I have already mounted')
}
}
}

WithConsole
就是一个高阶组件,它接收一个组件作为参数:
WrappedComponent
,并返回一个新的组件。在新的组件定义中,我们将
WrappedComponent
注册为
wrapped
组件,并在
template
中将其渲染出来,同时添加
mounted