关于el-select的二次封装

需求:项目中存在大量查询选择器,需要统一修改为select模式,为了实现组件复用,进行了select选择器的二次封装,由于每个渲染select选择器的数组中的label和value名称都不同,所以需要把数据名称一起传给子组件进行渲染。

因为刚开始没有想到传字段名到子组件,所以采用了处理子组件接收到的showList的值,处理之后再渲染,这样就降低了组件的可复用性,并写了大量的冗余代码,非常的不方便。

showList的值是父组件请求数据之后获取到的,所以渲染组件前showList为空,因此子组件默认值为value,并不是想要的“全部”默认值,在父组件data定义showList时加入初始值就搞定了。

简单的二次封装搞了这么久,代码能力着实需要加强...

//子组件  selfSelect
<template>
   <div style="display:inline">
      <el-select v-model="selectedOptions "
            v-if="showList"
          class="my-el-select">
          <el-option
            v-for="(item, index) in showList"
            :key="index"
            :label="item[valueName]"
            :value="item[labelName]">
          </el-option>
        </el-select>
</div>
</template>
<script>
export default {
    props:{
        value:{
            type:String
        },
        showList:{
            type:Object
        },
//相同名称的label和value不需传参给子组件,采用默认值
        valueName:{
            type:String,
            default:'label'
        }, 
        labelName:{
            type:String,
            default: 'value'
        } 
    },
    data(){
        return {
//data重新定义变量接受组件v-model(value:名称必须为value)值,不改变props接收的值
            selectedOptions :this.value
        }
    },
//监听值的变化
    watch:{
        value(newVal){
            this.selectedOptions =newVal
        },
//若选择器的值发生改变,则传参给父组件
//this.$emit(‘input’,val),在父组件直接用v-model绑定,则可以直接获取到
        selectedOptions (newVal,oldVal){
            this.$emit("input",this.selectedOptions )
        },
    } 
}
</script>


<style lang="less" scoped>
//选择框自定义样式
 /deep/ .my-el-select {
    margin-left: 10px;
    width: 120px;
    /* selecte 框的高度设置,默认是 40px*/
    .el-input__inner{
        height: 30px !important;
    }
    /* 下面设置右侧按钮居中 */
    .el-input__suffix {
        top: 5px;
    }
    .el-input__icon {
        line-height: inherit;
    }
    .el-input__suffix-inner {
        display: inline-block;
    }
    .el-icon-arrow-up {
      line-height: 0px !important;
    }
  } 
</style>
//父组件引用
 <SelfSelect v-model="showRoadCode" :showList="roadlist" valueName='roadName' labelName='roadCode'> </SelfSelect> 
参考链接:(39条消息) Vue2.x 二次封装双向绑定Selector_未末之初的博客-CSDN博客_vue二次封装select组件
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,以下是一个简单的示例代码,展示了如何对 el-cascader 进行二次封装: ```vue <template> <div> <el-cascader :options="options" :value="value" @change="handleChange" @blur="handleBlur" /> <div v-if="error" class="error-message">{{ error }}</div> </div> </template> <script> export default { name: 'CascaderWrapper', props: { options: { type: Array, required: true }, value: { type: Array, default: () => [] } }, data() { return { error: '' } }, methods: { handleChange(value) { // 自定义处理逻辑 // 可以在这里进行验证、格式化等操作 console.log('Selected value:', value) this.$emit('input', value) // 将改变的值通过自定义事件传递给父组件 }, handleBlur() { // 自定义处理逻辑 // 可以在这里进行验证等操作 if (!this.value.length) { this.error = 'Please select a value' } else { this.error = '' } } } } </script> <style scoped> .error-message { color: red; font-size: 12px; } </style> ``` 在上面的代码中,我们创建了一个名为 CascaderWrapper 的组件,对 el-cascader 进行了封装。props 中接收了 options 和 value 属性,分别用于设置 el-cascader 的选项和初始值。handleChange 方法用于处理 el-cascader 的 change 事件,并通过自定义事件将选中的值传递给父组件。handleBlur 方法用于处理 el-cascader 的 blur 事件,并在失去焦点时进行一些自定义操作,例如验证等。在模板中,我们使用了 el-cascader 组件,并绑定了 options、value、change 和 blur 事件。同时,我们还根据需要显示了一个错误消息。最后,我们将 CascaderWrapper 组件导出供其他组件使用。 请注意,这只是一个简单的示例代码,您可以根据自己的实际需求进行修改和扩展。希望对您有所帮助!如有更多疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值