首页 > 其他分享 >vue2组件二次封装

vue2组件二次封装

时间:2023-11-16 14:46:18浏览次数:40  
标签:封装 二次 UI vue2 组件 input change

有时候公共UI组件满足不了一些特定的需求样式,并且有较多地方使用同一个UI组件,这时候就需要考虑二次封装现有UI组件

组件二次封装关键的几点:

使用 $attrs 接收 props

使用 $listeners 接收事件

使用 $slots 和 $scopedSlots 接收插槽

使用model定义prop变量及其变化的事件(改变v-model的默认事件(input),同时避免表单校验时的交互bug)

覆盖原有事件(避免暴露出来的值变成[Object InputEvent])

 

以二次封装 a-input 为例:

my-input.vue

<template>
  <a-input v-bind="$attrs" v-on="new$listeners" :value="value">
    <!-- 遍历子组件非作用域插槽,并对父组件暴露 -->
    <template v-for="(index, name) in $slots" v-slot:[name]>
      <slot :name="name" />
    </template>
    <!-- 遍历子组件作用域插槽,并对父组件暴露 -->
    <template v-for="(index, name) in $scopedSlots" v-slot:[name]="data">
      <slot :name="name" v-bind="data"></slot>
    </template>
  </a-input>
</template>
<script>
export default {
  inheritAttrs: false, // 是否将继承的attribute设置到真实DOM上,这里没必要
  model: {
    prop: 'value',
    event: 'change' // 输入内容时,事件执行顺序为:chang =》 表单校验 =》 input, 所以这里不能写input,要写change
  },
  props: {
    value: [String]
  },
  data() {
    return {};
  },
  computed: {
    new$listeners() {
      return Object.assign(this.$listeners, {
        //在这里覆盖原有的 change 事件
        change: this.change
      });
    }
  },
  methods: {
    change(e) {
      this.$emit('change', e.target.value);
    }
  }
};
</script>

使用组件:

<PasswordInput
  v-model="form.aaa"
  @blur="inputBlur"
  @pressEnter="submit"
  size="large"
  placeholder="请输入"
/>

 

标签:封装,二次,UI,vue2,组件,input,change
From: https://www.cnblogs.com/djjlovedjj/p/17836193.html

相关文章

  • 【vue2】swiper插件自动循环失效(loop失效)
    可能是因为数据是动态渲染的,在请求到数据之前,就已经完成了swiper的初始化,因此解决方案有:1.swiper组件添加v-if:(如以下代码中的v-if="banner.length")<!--轮播图--><div:class="$style.newsBanner"><div:class="$style.swiperBox"><swip......
  • BI 数据可视化平台建设(2)—筛选器组件升级实践
    作者:vivo互联网大数据团队-WangLei本文是vivo互联网大数据团队《BI数据可视化平台建设》系列文章第2篇-筛选器组件。本文主要介绍了BI数据可视化平台建设中比较核心的筛选器组件,涉及组件分类、组件库开发等升级实践经验,通过分享一些对交互和业务耦合度高的组件开发迭代的......
  • git拉取项目失败怎么办? 前端vue2 都需要install 什么依赖
    gitconfig--list--show-origin查看git文件下面所有对应文件目录下面是设计配置文件http的缓存大小和那个最低时间和速度gitconfig--globalhttp.lowSpeedTime999999gitconfig--globalhttp.lowSpeedLimit0gitconfig--globalhttp.postBuffer1048576000 ......
  • 8、Flutter Paddiing组件
    Padding组件处理容器与子元素之间的间距。 classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnContainer(padding:constEdgeInsets.all(20),child:constIcon(Icons.abc_o......
  • 界面组件DevExpress Reporting v23.1亮点 - 全新升级报表查看器
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表界面组件DevExpressReportingv23.1已经发布一段时间了,新版本在报表查看器中拥有新的缩放......
  • Cocos Creator中骨骼动画组件的使用
    在CocosCreator游戏开发中,骨骼动画对于优化系统资源占用有很大帮助,很多时候我们都会使用。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~spine骨骼动画工具1:骨骼动画:把动画打散,通过工具,调骨骼的运动等来形成动画2:spine是一个非常流......
  • 7、Flutter GridView网格布局组件
    GridView创建网格列表主要有下面三种方式1、可以通过GridView.count实现网格布局   一行的Widget数量classHomePageextendsStatelessWidget{constHomePage({Key?key}):super(key:key);List<Widget>_getListData(){List<Widget>list=[];for(vari......
  • 【Vue】组件传值的六种方法
    Vue组件之间的通信大概归类为:父子组件通信:props;ref;$attrs/$listeners;$parent/$children兄弟组件通信:eventBus;vuex跨级通信:eventBus;Vuex;$attrs/$listeners一、props/$emit1.父组件向子组件传值通过props传值。父组件的代码:<template><divclass="secti......
  • vue3 父组件传值给子组件 子组件修改后回传给父组件
    父组件<jdy-goods-attrv-model:goods_sn="goods.goods_sn"></jdy-goods-attr>//尤总在vue3的时候给我们提供了一个新的思路:v-model来实现父传子,并且子也可以修改父组件传递过来的数据。子组件constprops=defineProps({goods_sn:{type:String,default:'......
  • vue3 子组件修改父组件的两种方法
    <jdy-goods-attr:goods_sn="goods.goods_sn"@goods_sn="(msg)=>goods.goods_sn=msg"v-model:goods_num="goods.goods_num"></jdy-goods-attr>constemit=defineEmits(['goods_sn',�......