在vue中如何优雅的封装第三方组件

news/2024/7/8 4:25:26 标签: javascript, 前端, vue.js

在使用第三方组件的时候或多或少的会因为样式,业务不符合自己的需求进而进行封装。是否你也会有这样的困扰。封装业务组件的时候,弄了好多业务进自己的组件里。要传递好多参数给自己封装的组件,然后再在封装的组件里传递给第三方组件。不禁要知道每个组件的参数的意思还要对其增加参数。用于传递给第三方组件。一旦业务拓展,就还需要对应往封装组件增加属性,组件内增加接收传递给第三方组件。后期维护起来痛苦不堪。那么下面我要说的便是可以解决你的问题。

$attrs

2.4.0 新增

主要作用是直接在封装的业务组件上将相应的属性参数可以直接给到第三方组件,不需要在业务组件中额外接收。

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

用法v-bind="$attrs"

业务组件
 <Image-slider-pro :bindPaneIndex="index"
                              :bindPane="`pane${index}`"
                              @nextPage="nextImage"
                              @prePage="preImage"
                              @drag-start="dragStart"
                              :model="model"
                              :direction="model === 'portrait' ? 'ttb' : 'ltr'"
                              @changeHandle="handleSliderChange"
                              :showTurnPage="(layoutData.length <= 4 && !(m ===3 && n ===1))"
                              v-if="layoutData[index].totalImage && (sequenceIndex === index || ctrlList.findIndex(key => index === key) > -1)"
                              :value.sync="layoutData[index].isExpanded ? layoutData[index].sliderCurrPage : layoutData[index].currPage"
                              :max="maxPage(index)"
                              :min="1"></Image-slider-pro>

业务组件内部
<template>
//....此处省略一堆代码
<vue-slider class="slider-main"
                  ref="imageSlider"
                  :width="model === 'portrait' ? 12 : 0"
                  :height="model === 'landscape' ? 12 : 0"
                  :duration="0"
                  :value="value"
                  :adsorb="true"
                  tooltipPlacement="top"
                  tooltip="none"
                  :processStyle="model === 'portrait' ? processStyleTtb : processStyleLtr"
                  @change="handleChange"
                  v-bind="$attrs"
                  v-on="$listeners">
        <template v-slot:dot>
          <div class="slider-dot">
            <div class="slider-dot_inner"></div>
          </div>
        </template>
      </vue-slider>
</template>
更多参考

https://cn.vuejs.org/v2/api/#vm-attrs

$listeners

2.4.0 新增

主要作用是监听事件,然后传递给第三方组件,不含 .native 修饰器的,官方解释

官网解释:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

使用 v-on="$listeners",参考上面代码。
更多参考

https://cn.vuejs.org/v2/api/#vm-listeners


http://www.niftyadmin.cn/n/5339500.html

相关文章

【AI知识片段】Transformer模型中的位置编码

1.什么是位置编码 位置编码描述序列中实体的位置或位置&#xff0c;以便为每个位置分配唯一的表示形式。单个数字&#xff08;如索引值&#xff09;不用于表示项目在转换器模型中的位置的原因有很多。对于长序列&#xff0c;索引的量级可能会变大。如果将索引值归一化为介于 0 …

双通道5V高细分步进电机——GC6129,可替代MS41929,具有低噪声、低振动的特点

GC6129是双通道5V低电压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机的变焦和对焦系统&#xff0c;万向节和其他精密&#xff0c;低噪声STM控制系统。该芯片为每个通道集成了256微步驱动器带SPI接口&#xff0c;用户可以方便地调整驱动器的参…

【 CSS 】基础 2

“生活就像骑自行车&#xff0c;想要保持平衡&#xff0c;就得不断前行。” - 阿尔伯特爱因斯坦 CSS 基础 2 1. emmet 语法 1.1 简介 Emmet语法的前身是 Zen coding&#xff0c;它使用缩写&#xff0c;来提高 HTML / CSS 的编写速度&#xff0c; VSCode 内部已经集成该语法。…

本地仓库如何与远程仓库进行关联

目录 设置Git 全局设置: 创建一个远程仓库 创建本地仓库 连接远程仓库 查看远程仓库origin的关联信息 查看所有远程仓库 切换远程仓库 设置Git 全局设置: git config --global user.name "your name" git config --global user.email "your email163.co…

使用Docker本地部署Jupyter Notebook并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

uniapp页面跳转的几种方式 以及举例(2)

又来混时长 嫖流量卷了 一,uni.navigateTo(OBJECT) 保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。 // 1.不传参 uni.navigateTo({url:./home/index }); // 2.传参字符串 uni.navigateTo({url:./home/index?title${tit…

Spring-简介

在向读者描述Spring时&#xff0c;笔者不打算从某处粘贴一段常见的概念性文字糊弄完本专栏的第一篇文章&#xff0c;而是用易于理解的话向读者指出几个重点。 &#xff08;1&#xff09;是框架。何谓框架&#xff1f;就像搭房子一样&#xff0c;框架就如同是墙体结构&#xff…

Opencv小项目——手势数字刷TIKTOK

​ 写在前面&#xff1a; 很久没更新了&#xff0c;之前的实习的记录也算是烂尾了&#xff0c;但是好在自己的实习记录还是有的&#xff0c;最近也忙碌了很多&#xff0c;终于放假了&#xff0c;今天下午正好没事&#xff0c;闲来无事就随便做个小玩意吧。 思来想去&#xff…