对于习惯使用 Vue 框架的人来说,高阶组件(HOC)这个概念是相对比较陌生的;高阶组件在 React 框架中是比较常见的一个概念,但是 Vue 中也是可以使用到高阶组件的;

一、高阶组件

1、什么是高阶函数?

高阶函数是为一个函数接受一个函数作为参数并返回一个新函数,使得新函数具有这个函数原先的功能又能够自定义的添加新的功能;

2、 什么是高阶组件?

高阶组件是一个将组件作为参数并返回一个新组件的函数‘;从这里来看,高阶组件其实是一个函数;因此高阶组件也具有高阶函数的一些特性;返回的新组件具有原组件的功能,同时也有了新自定义的功能;

具体点高阶组件其实就是装饰者模式的应用: 在不改变对象自身的前提下在程序运行期间动态的给对象添加一些额外的属性或行为;

3、特性

1、高阶组件(HOC)应该是无副作用的纯函数,且不应该修改原组件,即原组件不能有变动
2、高阶组件(HOC)不关心你传递的数据(props)是什么,并且新生成组件不关心数据来源
3、高阶组件(HOC)接收到的 props 应该透传给被包装组件即直接将原组件prop传给包装组件
4、高阶组件完全可以添加、删除、修改 props

4、使用

1、原始组件

// original.vue组件
<template><div><span @click="handleClick">props: {{test}}</span><slot></slot></div>
</template>
<script>
export default {name: 'original',props: {test: Number},methods: {handleClick () {this.$emit('original-click',{msg:'子组件emit'})}}
}
</script>

2、使用 render 构建的高阶组件

export default function newCom(base) {return {mounted () {console.log('我是HOC mounted log')},props: base.props, // 继承prosrender (h) {// 将 this.$slots 格式化为数组,因为 h 函数第三个参数是子节点,是一个数组const slots = Object.keys(this.$slots).reduce((acc, cur) => acc.concat(this.$slots[cur]), [])// 手动更正 context.map(vnode => {vnode.context = this._self //绑定到高阶组件上return vnode}) // 继承slotsreturn h(base, {on: this.$listeners,props: this.$props,attrs: this.$attrs}, slots)}}
}

3、使用

import original from "@/components/original.vue";
import newComfrom "@/hoc/newCom.js";const wrapOriginal = newCom(original);
Vue.component("wrap-original ", wrapOriginal );

上面的 newCom 就是一个高阶组件,他接收一个组件作为参数,又通过 render 函数返回一个新的组件;newCom 在返回新组件之前我们可以对原始组件 test 进行改造和继承;

二、高阶组件和 mixins 区别

高阶组件和 mixins 其实是互通的,他们俩是可以互相替代的,但是由于他们各自的特性影响,所以在 vue 框架大家更倾向于去使用 mixins,下面就看看他们俩之间的区别:

1、重用性:因为 minxins 对原组件具有侵入性,这会导致原来组件的可重用性降低,而高阶组件不会,高阶组件对原组件只是一个调用关系,并没有修改原来组件任何内容。

2、可测试性:因为高阶组件只是一个嵌套关系,在组件测试的时候,可以单独的测试原始组件和高阶组件;

3、层级问题:如果高阶组件嵌套层级太深,会导致出错的时候调试困难的问题;同时嵌套太多,因为有更多的组件实例,和组件属性传递增加,会带来更多性能上的消耗,以及传值问题;

4、稳定性:高阶组件会保持原有组件不被影响,不管外面如果改变都不会影响内部的组件;

Vue 高阶组件和 mixins相关推荐

  1. vue 高阶组件(HOC)

    1概念 一个函数接受一个组件为参数,返回一个包装后的组件(对象) 高阶组件:接受一个组件并返回一个组件(对象),这个组件具有原组件的功能,并拥有了新自定义的功能. Vue 的世界里,高阶组件就是 fn ...

  2. Vue高阶组件的原理以及实践

    前言 高阶组件在许多使用Vue框架进行开发的前端工程师的印象中,大部分都比较陌生.Vue官网也没有推出这一方案的使用,大概是官方也觉得不好用.但这不影响我们来学习高阶组件的这种思维,看完本篇希望你对高 ...

  3. 你已经是成熟的前端,应该学会自己使用 Vue 高阶组件了

    作者简介: 李中凯老师,8年前端开发,前端负责人,擅长JavaScript/Vue. 公众号:1024译站 掘金文章专栏:https://juejin.im/user/57c7cb8a0a2b5800 ...

  4. [vue] 你了解什么是高阶组件吗?可否举个例子说明下?

    [vue] 你了解什么是高阶组件吗?可否举个例子说明下? 高阶组件 高阶组件介绍 vue 高阶组件的认识,在React中组件是以复用代码实现的,而Vue中是以mixins 实现,并且官方文档中也缺少一 ...

  5. 【Vue】你了解高阶组件吗

    文章目录 前言 一.什么是高阶组件`(HOC)`? 二.Vue高阶组件实例 前言 高阶组件在React社区中十分火热,但是在Vue中热度并不高,本文就来了解一下Vue中的高阶组件. 一.什么是高阶组件 ...

  6. 写一个组织架构图组件来深入认识vue函数式高阶组件

    本文涉及到的知识点: Vue函数式组件 递归函数 深拷贝对象 正则匹配 近期在开发一个vue组织架构图组件时,为了实现高性能渲染和一些特殊用法,使用了函数式组件,要实现的效果是这样: 写一个组织架构图 ...

  7. 「react进阶」一文吃透React高阶组件(HOC)

    一 前言 React高阶组件(HOC),对于很多react开发者来说并不陌生,它是灵活使用react组件的一种技巧,高阶组件本身不是组件,它是一个参数为组件,返回值也是一个组件的函数.高阶作用用于强化 ...

  8. React——高阶组件(HOC)

    What ?什么是HOC HOC(High Order Component) 是 react 中对组件逻辑复用部分进行抽离的高级技术,但HOC并不是一个 React API . 它只是一种设计模式,类 ...

  9. vue 高阶面试题_大厂面试题合集

    最近从网上收集了一些大厂的面试题,下面分享给大伙,希望能给哪些在找工作以及准备找工作的朋友一些帮助. 面试准备: 虽然说作为软件开发工程师,需要靠持之以恒的锻炼.积累和沉淀提升个人技术水平:但在平常业 ...

最新文章

  1. asp.net UrlRewrite 技术的实现
  2. 【OpenGL从入门到精通(二)】绘制一个点
  3. Git教程学习总结(分享给热爱学习的你,团队的协作离不开你呀)
  4. 手语识别_如何使用转移学习进行手语识别
  5. LeetCode —— 链表相关(206、141)
  6. JavaScript内建对象
  7. 微信小程序左右菜单mysql_微信小程序tab左右滑动切换功能的实现代码
  8. JMX实现远程服务器Tomcat系统监控之一
  9. bilibili直播: Vue.js Podcast(小记录)~~~
  10. HackTheBox You know racecar 格式化字符串漏洞pwn题目
  11. Model of an Electric Arc for Circuit Analysis(翻译)
  12. linux测试dvi接口,支持Linux系统的高清DVI采集卡推荐
  13. LiveNVR传统视频监控互联网无插件-按需直播最大利用有效上行
  14. 魔镜连接本地mysql_打造属于你的树莓派“魔镜”—硬件篇
  15. Win10域客户端强制更改壁纸
  16. 2022Android各APP免费加固方案评估
  17. 图形世界分裂的两派 理清Direct3D和OpenGL的脉络
  18. 超好用的导航首页(最新)
  19. Spring Cloud微服务开发笔记4——Ribbon框架使用方法
  20. 逍遥安卓-完整命令行

热门文章

  1. matlab 隶属函数,Matlab中已经开发出了( )种隶属函数。
  2. Ubuntu 操作系统学习笔记之二--系统目录架构
  3. 图论01.最短路专题_学习笔记+模板
  4. python素数100以内_Python求出0~100以内的所有素数
  5. 天生最感性的诱惑,这是你香喷喷的鸡哟
  6. 还在手动发包?手把手教你 Jenkins 自动化部署SpringBoot
  7. mac 因为代理问题突然连不上网
  8. OkHttp源码解析(很细 很长)
  9. Android Synchronized 关键字学习
  10. 根据ip查询归属地信息