Vue高阶组件_高阶组件的承上启下

Vue高阶组件_高阶组件的承上启下目录一、高阶组件概念二、目标三、思路四、准备五、实现六、难点Reference一、高阶组件概念何谓高阶组件?类比高阶函数的定义:将函数作为参数的函数就是高阶函数,那么,将组件作为参数的组件就是高阶组件。二、目标假如我们有一个组件,我们希望通过某个函数,去扩展它,得到一个新的组件,新的组件有完全的参数组件的行为,如果这点可以满足,那么其他扩展就可以针对性的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

目录

一、高阶组件概念

二、目标

三、思路

四、准备

五、实现

六、难点

Reference


一、高阶组件概念

何谓高阶组件?类比高阶函数的定义:将函数作为参数的函数就是高阶函数,那么,将组件作为参数的组件就是高阶组件。

二、目标

假如我们有一个组件,我们希望通过某个函数,去扩展它,得到一个新的组件,新的组件有完全的参数组件的行为,如果这点可以满足,那么其他扩展就可以针对性的进行处理了。组件最重要的三个功能就是事件、属性以及插槽,通过函数得到新的组件如果能完全复制参数组件的这三项能力,那么这个函数就是一个合格的高阶组件。

三、思路

通过组件的render函数基于参数组件的模板进行属性、事件乃至插槽的捆绑

四、准备

我们先定义一个baseComp,一个函数hoc.js,将baseComp传入得到wrapperComp

 

baseComp.vue

<template>
  <div>
    <button @click="$emit('handle-click')">点击事件</button><br>
    <!--  --> props[p] =======> {
  
  {p}} <br>
    <!--  --> data[myProp] =======> {
  
  {myProp}}<br><br>
    <slot /> --------------------插槽分割线-------------------- <br>
    <slot name="sname" />
  </div>
</template>
<script>
export default {
  props: ['p'],
  components: {},
  data() {
    return {
      myProp: "baseProp1",
    };
  },
  created() {},
  methods: {},
  mounted() {},
  computed: {}
};
</script>

Jetbrains全家桶1年46,售后保障稳定

hoc.js

export default function Wrapper(baseComp) {
 return {
  data() {
   return {};
  },
  mounted() {},
  render(h) {
   return h(baseComp, {})
  }
 }
}

app.vue

<style>
.app {
  padding: 20px;
}
</style>
<template>
  <div class="app">
    /********************** baseComp start **********************/
    <br />
    <baseComp @handle-click="handle" p="baseApp">
      <div>我是一个默认插槽:base默认slot</div>
      <template v-slot:sname>
        <div>我是一个具名插槽:base具名slot</div>
      </template>
    </baseComp>
    <br />
    /********************** baseComp end **********************/
    <br />
    <br />
    /********************** wrapperComp start **********************/
    <br />
    <wrapperComp @handle-click="handle" p="wrapperApp">
      <div>我是一个默认插槽:wrapper默认slot</div>
      <template v-slot:sname>
        <div>我是一个具名插槽:wrapper具名slot</div>
      </template>
    </wrapperComp>
    /********************** wrapperComp end **********************/
  </div>
</template>
<script>
import baseComp from "./baseComp.vue";
import hoc from "./hoc";
const wrapperComp = hoc(baseComp);
export default {
  components: { baseComp, wrapperComp },
  created() {},
  methods: {
    handle() {
      alert("handle success");
    }
  },
  mounted() {},
  computed: {}
};
</script>

 

我们通过将baseComp传递给hoc.js得到wrapperComp组件,目前只是将模板进行复制,我们来看看效果:

image.png

如图我们已经完成一个组件生成另一个组件了,但是你会发现,属性、插槽以及事件都不能正确传递,接下来我们依次实现

五、实现

1、属性、事件

hoc.js

...
render(h) {
   return h(baseComp, {
    on: this.$listeners,
    attrs: this.$attrs,
    props: this.$props
   })
  }
...

点击下方按钮也能触发事件了

image.png

2、插槽

hoc.js

...
  render(h) {
   let scopedSlots = {};
   let $slots = this.$slots;
   Object.keys($slots).map((key) => (scopedSlots[key] = () => $slots[key]))
   return h(baseComp, {
    on: this.$listeners,
    attrs: this.$attrs,
    props: this.$props,
    scopedSlots
   })
  }
...

插槽内容也能传递

image.png

六、难点

1、忽略 props 使得声明的属性没有传递

2、使用this.slots绑定插槽:插槽内容无法按照插槽顺序渲染(因为只是简单的模板列表的平铺,不涉及作用域属性)

Reference

1、Discussion: Best way to create a HOC

https://github.com/vuejs/vue/issues/6201

2、探索Vue高阶组件

http://hcysun.me/2018/01/05/%E6%8E%A2%E7%B4%A2Vue%E9%AB%98%E9%98%B6%E7%BB%84%E4%BB%B6/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210116.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 个人对json的一些简单理解「建议收藏」

    个人对json的一些简单理解「建议收藏」在最近的学习中,查阅了很多资料,了解了一些关于json的基本知识,下面做一个简单的总结:json是什么没有.json结尾的这种文件,json(JavaScriptObjectNotation)是一种简单的数据交换格式,在此之前我也不知道这个东西其实没有想象的那么抽象,看看后面的例子会更清晰json中的数据结构json中只有两种数据基本结构,一种是MAP,或者叫对象,另一种是Ar…

    2022年6月9日
    40
  • 权限表和菜单表_sqlserver赋予用户表权限

    权限表和菜单表_sqlserver赋予用户表权限selectm.*     fromt_menum     wherem.state=’1′      and((menu_type=1andexists        (select1          fromv_user_menub          wherem.menu_id…

    2022年9月29日
    3
  • VC++ InvalidateRect

    VC++ InvalidateRect     该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。  BOOLInvalidateRect(  HWNDhWnd,//handleofwindowwithchangedupdateregion  CONSTRECT*lpRect,//addressofrectanglecoordinates  BOOLbEras

    2025年6月8日
    2
  • MATLAB GUI编程总结

    MATLAB GUI编程总结MATLABGUI编程总结:创建MatlabGUI界面通常有两种方式:1使用.m文件直接动态添加控件2使用GUIDE快速的生成GUI界面一、创建GUI方法一.:在.m文件中动态添加h_main=figure(‘name’,‘ademoofguidesign’,‘menubar’,‘none’,…’numbertitle’,’off’,’posi…

    2022年4月29日
    43
  • 敏捷软件开发中的配置管理

    敏捷软件开发中的配置管理敏捷软件开发方法目的是适应需求的快速响应 能够快速的发布和快速的交付使用 在敏捷中的如何实现配置管理 如何通过配置管理来管理敏捷开发过程中的需求 代码 版本等 这是应该是一个专向的课题 敏捷中的配置管理有如下几个方面需要考虑 1 适应敏捷需求的变化 快速的纳入需求版本管理 2 适应频繁的代码构造和频繁的发布 3 能够提供准确的发布版本的内容 4 如何和持续集成结合 做好持续集成的最后的结果输出 提高持续的交付能力

    2025年8月29日
    1
  • 误差分析_误差百分比计算公式

    误差分析_误差百分比计算公式误差分析

    2022年4月20日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号