vue封装一个组件需要哪些步骤,vue自己封装组件 vue项目中

  vue封装一个组件需要哪些步骤,vue自己封装组件 vue项目中

  本文主要介绍前端框架封装Vue第三方组件的三个技巧实例的详细讲解。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  

目录

  简介一、使用第三方组件的属性二。使用第三方组件的自定义事件。使用第三方组件的槽。使用第三方组件的方法

  

引言

  在封装第三方组件时,我们经常会遇到一个问题,如何通过封装的组件使用第三方组件的Attributes(属性)、Events(自定义事件)、Methods(方法)、Slots(槽位)。

  当然,这个问题并不难解决。用普通方法解决很难避免繁琐重复的工作,封装的组件代码可读性不高。

  本专栏将介绍使用第三方组件Attributes(属性)、Events(自定义事件)和Slots(插槽)的三个技巧,但使用第三方组件Methods(方法)的技巧需要优化。

  

一、使用第三方组件的属性

  封装了elementUI的el-input输入框组件称为myInput。如果想给myInput组件添加一个disabled属性来禁用输入框,怎么实现呢?学生通常会这样做。

  //myInput.vue

  模板

  差异

  El-input v-model= inputVal :disabled= disabled /El-input

  /div

  /模板

  脚本

  导出默认值{

  道具:{

  值:{

  类型:字符串,

  默认值: ,

  },

  已禁用:{

  类型:布尔型,

  默认值:false

  }

  },

  计算值:{

  输入值:{

  get() {

  返回this.value

  },

  设置(值){

  这个。$emit(input ,val);

  }

  }

  }

  }

  /脚本

  过了一会儿,我们必须将el-input组件的其他属性添加到myInput组件中。el-input组件的多属性总共有27个,那么应该怎么做呢?我们是不是用prop把它们一个一个传进去,不仅繁琐而且可读性差。您可以使用$attrs一步到位。我们先来看看attrs的官方定义。

  $attrs:包含父范围中未被识别(和获取)为属性的属性绑定(除了类和样式)。当一个组件没有声明任何属性时,它将包含所有的父作用域绑定(除了类和样式),并可以通过v-bind=$attrs 传递到内部组件中

  //myInput.vue

  模板

  差异

  El-input v-model= input v-bind= $ attrs /El-input

  /div

  /模板

  这还不够。您必须将inheritAttrs选项设置为false。为什么?看看inheritAttrs选项的官方定义就知道了。

  默认情况下,不被识别为props的父范围的属性绑定将被“回滚”,并作为普通的HTML属性应用于子组件的根元素。当编写包装目标元素或另一个组件的组件时,这可能并不总是符合预期的行为。

  通过将inheritAttrs设置为false,这些默认行为将被移除。这些属性可以通过$attrs生效,且可以通过v-bind显式绑定到非根元素。注意:该选项不影响类和样式绑定。

  简单地说,将inheritAttrs设置为false,这样可以避免为myInput组件设置的属性被添加到myInput组件的根元素div中。

  //myInput.vue

  模板

  差异

  El-input v-model= input v-bind= $ attrs /El-input

  /div

  /模板

  脚本

  导出默认值{

  inheritantrs:false,

  道具:{

  值:{

  类型:字符串,

  默认值: ,

  },

  },

  计算值:{

  输入值:{

  get() {

  返回this.value

  },

  设置(值){

  这个。$emit(input ,val);

  }

  }

  }

  }

  /脚本

  这样,el-input组件的属性就可以直接用在myInput组件上,不管后续的el-input组件添加了多少属性。

  

二、使用第三方组件的自定义事件

  如果在myIpput组件上使用el-input组件上的自定义事件会怎么样?可能你的第一反应是这个。$emit。

  //myInput.vue

  模板

  差异

  El-input v-model= input v-bind= $ attrs @ blur= blur /El-input

  /div

  /模板

  脚本

  导出默认值{

  inheritantrs:false,

  道具:{

  值:{

  类型:字符串,

  默认值: ,

  },

  },

  计算值:{

  输入值:{

  get() {

  返回this.value

  },

  设置(值){

  这个。$emit(input ,val);

  }

  }

  },

  方法:{

  模糊(){

  这个。$emit(模糊)

  }

  }

  }

  /脚本

  my input v-model= value @ blur= handle blur /my input

  El-input组件有四个自定义事件,并不算多。如果遇到更多带有自定义事件的第三方组件,该怎么办?是不是一个一个加,会增加一堆不必要的方法?事实上,您可以一步到位地使用$listeners。我们先来看看$listeners的官方定义。

  $listeners:包含父作用域中的v-on事件侦听器(没有。原生修饰符)。可以通过v-on=$listeners 传入内部组件。

  //myInput.vue

  模板

  差异

  El-input v-model= input v-bind= $ attrs v-on= $ listeners /El-input

  /div

  /模板

  然后将v-on=$listeners 添加到myInput组件中的el-input组件,就可以在myInput组件上使用el-input组件定义的事件了。

  

三、使用第三方组件的插槽

  如果在myIpput组件上使用el-input组件上定义的插槽会怎么样?做这件事没有多少技巧。多少个插槽是第三方组件定义的,封装的时候要露出插槽标签。例如,el-input组件中的前缀槽是公开的,代码如下:

  //myInput.vue

  模板

  差异

  El-input v-model= input v-bind= $ attrs @ blur= blur

  模板#前置

  slot name=prepend/slot

  /模板

  /el-input

  /div

  /模板

  

四、使用第三方组件的方法

  使用ref,首先向myInput组件中的el-input组件添加一个ref=elInput 属性,

  //myInput.vue

  模板

  差异

  el输入ref=输入/el输入

  /div

  /模板

  脚本

  导出默认值{

  已安装(){

  this.elInput=this。$ refs.elInput

  }

  }

  /脚本

  这里应该注意安装父子组件的执行时间,因为一般来说,el-input组件是全局引入的,并且这些组件是同步引入的。此时,el-input组件的安装将在myInput组件的安装之前执行,因此。在myInput组件的mounted中,可以将refs.elInput分配给myInput组件的this的属性。

  myInput组件使用el-input组件有两种方式,与myInput组件的引入有关。

  如果同步引入myInput组件

  模板

  差异

  myInput ref=myInput/myInput

  /div

  /模板

  脚本

  从“”导入myInput。/my input . vue ;

  导出默认值{

  data() {

  返回{

  }

  },

  组件:{

  我的输入,

  },

  已安装(){

  //调用el输入组件的focus方法

  这个。$ refs . my input . elinput . focus();

  }

  }

  /脚本

  如果myInput组件是异步引入的

  模板

  差异

  myInput ref=myInput/myInput

  /div

  /模板

  脚本

  导出默认值{

  data() {

  返回{

  }

  },

  组件:{

  myInput: ()=import(。/my input . vue’)

  },

  已安装(){

  //调用el输入组件的focus方法

  setTimeout(()={

  这个。$ refs . my input . elinput . focus();

  })

  }

  }

  /脚本

  以上就是前端框架封装Vue第三方组件的三个技术细节。更多关于封装Vue第三方组件的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: