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


相关推荐

  • C++学习之路—— STL标准模板库概述

    C++学习之路—— STL标准模板库概述例题1:将课程中讲过的vector容器和list容器的操作都使用一遍。代码如下:template <typename T> void VectorShow(vector<T> v){ cout << “使用模板函数打印容器所有元素!” << endl; for (int i = 0; i < v.size(); i++) { …

    2022年8月18日
    5
  • A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    2022年2月24日
    51
  • 机器学习案例——鸢尾花数据集分析

    机器学习案例——鸢尾花数据集分析    前几天把python基础知识过了一遍,拿了这个小例子作为练手项目,这个案例也有师兄的帮助,记录完,发现代码贴的很多,文章有点长,为了节省篇幅,有一些说明就去掉了,毕竟鸢尾花数据集比较经典,网上能找到很多和我差不多的案例。还有就是发现一个新的markdown排版工具,今天想试试效果。数据来源    首先说一下,该数据集来源于网络。Iris也称鸢尾花卉数据集,是一类多重变量分析的数……

    2022年10月3日
    2
  • C语言输出所有的水仙花数

    C语言输出所有的水仙花数输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字立方之和等于该数本身。例如,153是一个水仙花数,因为153=1³+5³+3³解题思路:水仙花数的解题思路是把给出的某个三位数的个位、十位、百位分别拆分,并求其立方和。程序能正常运行并准确输出“水仙花数”。定义i为水仙花数,运用for循环for(❶i=100;❷i<=999;❸i++)先执行❶,再执行❷判断条件是否满足,满足执行下列花括号,最后执行❸,一次循环结束;再执行❷判断条件是否满足,满足执行下列花括号,最后

    2022年7月24日
    7
  • mysql查看表结构的几种方式

    在我第N次忘记如何查看表结构后,在网上查了一下后,看到有好几种查看表结构的方式,总结一下。以student(sid,sname,birthday,sex)的查看为例。【方式一】:descstudent;语法:desc表名;———————用于查看表整体结构【方式二】:describestudent;…

    2022年4月3日
    199
  • debian9.5安装教程_debian11安装教程

    debian9.5安装教程_debian11安装教程IPSET是Linux内核中用来建立、维护和查看IP集合的工具,常常与iptables配合使用。在Debian-5.0.3下安装ipsetv2.3.3,遇到了一些问题,最终安装成功。将安装过程及遇到的问题和大家分享。 1安装环境Debian-5.0.3,安装过程中选择内核为2.6.26-2-486。 2用Debian的包管理器aptitude安装ipset安装完成以后

    2022年9月1日
    4

发表回复

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

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