组件二次封装浅谈

2,226 阅读2分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

前言

市面上组件库很多,相信各位选的组件库都能满足大部分的日常需求,但偶尔呢,由于业务需要,我们需要对组件库进行二次封装,来添加一些业务代码,或是添加一些逻辑处理做更深程度的封装。今天我们来探讨一下二次封装。

需求

脱离需求,代码的意义不大,我们先看需求。

需求:我司用的后台管理系统的UI框架是element-UI, 这个管理后台有很多表单,表单的字段又非常的多,在实际开发过程中,开发常是复制黏贴,测试常常发现字段验证无效,或是保存时发现少了字段,有时候发现样式有兼容问题。现在需要解决这个问题。

思路

这个问题产生的原因是字段太多,开发都是复制黏贴,所以常忘改对应得prop、字段名,而且由于表单太长,代码也非常的长,错了一俩个拼写,基本看不出来,

这么一看,我们需要减少复制,并且让代码清晰,这样一想,我们可以采用配置来替代复制,json的可观性比html要好一些。

实现过程解析

首先我们需要保证每一个组件的方法和参数都还能用。

这点vue给我们提供 v-bind 批量绑定属性,v-on 批量绑定方法,而获取父组件的属性、方法,可以通过$prop, $listeners分别获取。 所以子继承父组件所有方法和属性的写法是:

<comp v-bind='$props' v-on="$listeners"></comp>

父传子有了,子传父,我们可以采用v-model来实现。

v-model, 原理网上讲烂了,这里不多说,我们注意一下model里面的配置,注意方法名和变量名。

export default {
    model: {
      prop: 'value',
      event: 'input'
    },
}

因为是要减少复制,那么就要对表单进行封装,但表单内用哪个组件,我们在封装的过程中是不知道的,但全用v-if 来判断就low了。幸好vue提供了component配合is,代码看起来好看多了

<component :is="schema.component" v-model="currentValue" v-bind="bindProps" v-on="schema.on" @change="setFormModel" clearable :size='size' class='w100'>
        <template v-if='schema.component === "el-select"'>
          <el-option
            v-for="item in schema.componentProps.options"
            :key="item.value"
            :label="item.label"
            :value="item.value">
          </el-option>
        </template>
        <template v-else-if='schema.component === "el-radio-group"'>
          <el-radio v-for="item in schema.componentProps.options"
            :key="item.value"
            :label="item.value"
            >{{item.label}}</el-radio>
        </template>
      </component>

有了这三个,二次封装的基础就有了,来试试。

最终实现版

这里提供一个实现前文需求的完整例子:

gitee.com/myreborns/c…