iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue3 Composition API怎么优雅封装第三方组件
  • 616
分享到

Vue3 Composition API怎么优雅封装第三方组件

2023-07-02 16:07:02 616人浏览 泡泡鱼
摘要

本篇内容介绍了“vue3 Composition api怎么优雅封装第三方组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所

本篇内容介绍了“vue3 Compositioapi怎么优雅封装第三方组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

对于第三方组件,如何在保持第三方组件原有功能(属性props、事件events、插槽slots、方法methods)的基础上,优雅地进行功能的扩展了?

以Element Plus的el-input为例:

很有可能你以前是这样玩的,封装一个MyInput组件,把要使用的属性props、事件events和插槽slots、方法methods根据自己的需要再写一遍:

// MyInput.Vue<template>  <div class="my-input">    <el-input v-model="inputVal" :clearable="clearable" @clear="clear">    <template #prefix>      <slot name="prefix"></slot>    </template>      <template #suffix>      <slot name="suffix"></slot>    </template>    </el-input>  </div></template><script setup>import { computed } from 'vue'const props = defineProps({  modelValue: {    type: String,    default: ''  },  clearable: {    type: Boolean,    default: false  }})const emits = defineEmits(['update:modelValue', 'clear'])const inputVal = computed({  get: () => props.modelValue,  set: (val) => {    emits('update:modelValue', val)  }})const clear = () => {  emits('clear')}</script>

可过一段时间后,需求变更,又要在MyInput组件上添加el-input组件的其它功能,可el-input组件总共有20个多属性,5个事件,4个插槽,那该怎么办呢,难道一个个传进去,这样不仅繁琐而且可读性差。

在Vue2中,我们可以这样处理,点击此处查看 封装Vue第三方组件

此文诣在帮助大家做一个知识的迁移,探究如何使用Vue3 CompositionAPI优雅地封装第三方组件~

一、对于第三方组件的属性props、事件events

在Vue2中

  • $attrs: 包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件

  • $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件

而在Vue3中

  • $attrs:包含了父作用域中不作为组件 props 或自定义事件的 attribute 绑定和事件(包括 class 和 style和自定义事件),同时可以通过 v-bind="$attrs" 传入内部组件。

  • $listeners 对象在 Vue 3 中已被移除。事件监听器现在是 $attrs 的一部分。

  • 在 <script setup>中辅助函数useAttrs可以获取到$attrs。

//MyInput.vue <template>  <div class="my-input">    <el-input v-bind="attrs"></el-input>  </div></template><script setup>import { useAttrs } from 'vue'const attrs = useAttrs()</script>

当然,这样还不够。光这样写,我们绑定的属性(包括 class 和 style)同时会在根元素(上面的例子是class="my-input"的Dom节点)上起作用。要阻止这个默认行为,我们需要设置inheritAttrs为false。

下面我们来看看Vue3文档对inheritAttrs的解释

默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 html attribute 应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过实例 property $attrs 可以让这些 attribute 生效,且可以通过 v-bind 显性的绑定到非根元素上。

于是,我们对于第三方组件的属性props、事件events处理,可以写成如下代码:

// MyInput.vue <template>  <div class="my-input">    <el-input v-bind="attrs"></el-input>  </div></template><script>export default {  name: 'MyInput',  inheritAttrs: false}</script><script setup>import { useAttrs } from 'vue'const attrs = useAttrs()</script>

二、对于第三方组件的插槽slots

Vue3中

  • $slots:我们可以通过其拿到父组件传入的插槽

  • Vue3中移除了$scopedSlots,所有插槽都通过 $slots 作为函数暴露

  • 在 <script setup>中辅助函数useSlots可以获取到$slots。

基于以上几点,如果我们对于第三方组件的封装没有增加额外的插槽,且第三方组件的插槽处于同一个dom节点之中,我们也有一种取巧的封装方式????, 通过遍历$slots拿到插槽的name,动态添加子组件的插槽:

//MyInput.vue <template>  <div class="my-input">    <el-input v-bind="attrs">      <template v-for="k in Object.keys(slots)" #[k] :key="k">        <slot :name="k"></slot>      </template>    </el-input>  </div></template><script>export default {  name: 'MyInput',  inheritAttrs: false}</script><script setup>import { useAttrs, useSlots } from 'vue'const attrs = useAttrs()const slots = useSlots()</script>

如果不满足以上条件的话,咱还得老老实实在子组件中手动添加需要的第三方组件的插槽~

三、对于第三方组件的方法methods

对于第三方组件的方法,我们通过ref来实现。首先在MyInput组件中的el-input组件上添加一个ref="elInputRef"属性,然后通过defineExpose把elInputRef暴露出去给父组件调用。

子组件:MyInput.vue

// MyInput.vue <template>  <div class="my-input">    <el-input v-bind="attrs" ref="elInputRef">      <template v-for="k in Object.keys(slots)" #[k] :key="k">        <slot :name="k"></slot>      </template>    </el-input>  </div></template><script>export default {  name: 'MyInput',  inheritAttrs: false}</script><script setup>import { useAttrs, useSlots } from 'vue'const attrs = useAttrs()const slots = useSlots()const elInputRef = ref(null)defineExpose({  elInputRef  // <script setup>的组件里的属性默认是关闭的,需通过defineExpose暴露出去才能被调用})</script>

父页面:Index.vue的调用代码如下:

// Index.vue <template>  <my-input v-model='input' ref="myInput">    <template #prefix>姓名</template>  </my-input></template><script setup>import MyInput from './components/MyInput.vue'import { ref, onMounted } from 'vue'const input = ref('')const myInput = ref(null) // 组件实例onMounted(()=> {  myInput.value.elInputRef.focus() // 初始化时调用elInputRef实例的focus方法})</script>

“Vue3 Composition API怎么优雅封装第三方组件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Vue3 Composition API怎么优雅封装第三方组件

本文链接: https://www.lsjlt.com/news/343262.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作