Vue如何更好的封装组件?几个小技巧助你成为组件封装达人,让我们封装的组件更加优雅易用

Posted CharmDeer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue如何更好的封装组件?几个小技巧助你成为组件封装达人,让我们封装的组件更加优雅易用相关的知识,希望对你有一定的参考价值。

目录

一、$attrs

我们在使用组件的过程中,有时需要给被封装的子组件传递Prop
例如:

<template>
    <el-input v-model="innerVal" placeholder="placeholder"
    @input="$emit('input',$event)"
    >
    </el-input>
</template>

<script>
  export default 
    name: "MyInput",
    data()
      return
        innerVal:this.value
      
    ,
    watch:
      value()
        if(this.value!==this.innerVal)
          this.innerVal=this.value
        
      
    
  
</script>

<style scoped>

</style>

我们二次封装了my-input组件
需求:通过my-input组件将el-input原有的clearable属性传递给它
原始做法:
我们可以在my-input组件中声明clearable属性,通过my-input组件接收clearable

再将它传递给el-input组件:

父组件未传递clearable值:

父组件传递clearable值:


但是如果每一个Prop都需要父组件声明,再一个一个传递给子组件,那就太麻烦了

此时我们可以利用组件实例上的$attrs属性来简化这个过程


这个属性包含了组件被传入,但没有被声明的Prop
我们可以打印这个属性来看一下:
第一步:清除之前的声明
第二步:在create钩子中打印$attrs属性

查看打印结果:

这里面就包含的有我们传入的clearable属性
接下来我们可以通过v-bind指令,以传入对象的方式将 $attrs中的属性,绑定到子组件上,这样父组件就无需声明,就可以轻松地将这些prop传递给子组件



这样父组件就无需声明,就可以轻松地将这些prop传递给子组件

但需要注意的一点是,Vue会将组件被传入,但未声明的prop作为html属性绑定到组件的根元素上:

因此我们需要用下面的属性来处理这种情况

将其值设置为false来避免这种行为

解决:

$attrs其实相当于传输数据的一个桥梁

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Title</title>
</head>
<body>

<div id="app">
    <the-parent :rootData="rootData"></the-parent>

</div>
<template id="theParent">
    <the-children v-bind="$attrs"></the-children>
</template>
<template id="theChildren">
    <div>子组件展示:rootdata</div>
</template>

<script src="../js/vue.js"></script>
<script>
  const app = new Vue(
    el: '#app',
    data: 
      rootData: "根组件的数据"
    ,
    components: 
      theParent: 
        template: "#theParent",
        // inheritAttrs:false,
        created() 
          console.log(this.$attrs)
        ,
        components: 
          theChildren: 
            template: "#theChildren",
            props: ['rootdata'],
          
        
      
    
  );
</script>
</body>
</html>

运行结果:

二、$listeners

刚才我们介绍了如何将prop传递给子组件,如果我们想将事件处理函数传递给子组件时

原始做法:
我们先将一个事件处理函数绑定到子组件上

再在事件处理函数中,触发事件

来触发绑定在父组件上的处理函数

结果:

新用法:

与 $attrs的用法类似,当我们需要将事件处理函数传递给子组件时,可以利用父组件实例上的 $listeners属性,这个属性包含了组件接收到的事件处理函数

现在我们给MyInput父组件绑定了clear事件的处理函数,
我们首先也在created钩子中打印一下 $listeners属性

这个 $listeners就包含我们传入的clear处理函数
去掉原始做法

现在我们配合v-on指令将这个处理函数直接转发给子组件

直接就能接收父组件的处理事件:

三、$slots

以上是关于Vue如何更好的封装组件?几个小技巧助你成为组件封装达人,让我们封装的组件更加优雅易用的主要内容,如果未能解决你的问题,请参考以下文章

记录--9个封装Vue组件的小技巧

NuGet的几个小技巧

封装Vue组件的一些技巧

vue 封装组件样式小技巧

全是干货!封装Vue组件的一些技巧

封装Vue组件的一些技巧