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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Android】Android加密和解密方式

    【Android】Android加密和解密方式一、不可逆加密不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。如信息摘要(MessageDigest)和安全散列(SecureHash)算法属于此类,常见的算法包括MD5、SHA1、PBKDF2、bcrypt等。特点:使用MD5和SHA进行加解密://MD5加密privatestaticStringt

    2022年5月17日
    43
  • 详解QueryPerformanceCounter中出现LARGE_INTEGER[通俗易懂]

    详解QueryPerformanceCounter中出现LARGE_INTEGER[通俗易懂]LowPart低32位。HighPart高32位。QuadPart有符号的64位整数。LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPa

    2022年7月1日
    22
  • SVN服务器搭建和使用[通俗易懂]

    SVN服务器搭建和使用[通俗易懂]SVN服务器搭建和使用

    2022年4月24日
    58
  • 卷积 bn_卷积积分实验

    卷积 bn_卷积积分实验1.为什么要合并BN层在训练深度网络模型时,BN(BatchNormalization)层能够加速网络收敛,并且能够控制过拟合,一般放在卷积层之后。BN层将数据归一化后,能够有效解决梯度消失与梯度爆炸问题。虽然BN层在训练时起到了积极作用,然而,在网络前向推断时多了一些层的运算,影响了模型的性能,且占用了更多的内存或者显存空间。目前,很多先进的网络模型(ResNet,MobileN…

    2022年10月14日
    0
  • xshell的安装和使用_Xshell命令

    xshell的安装和使用_Xshell命令Xshell安装Xshell安装完后提示更新到最新版本

    2022年9月8日
    0
  • java—final关键字

    java—final关键字

    2021年9月29日
    40

发表回复

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

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