接收一个组件作为参数,返回一个新的组件 ,那么此时我们需要思考的是,在
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










