多选搜索_多选分组下拉框的封装

首先,还是沿袭之前写文章的方式,先贴设计稿,再来分析,需求

f65e6b04d3e3797e70ebcf38d65d5f33.png

从图上我们可以看出,票价类型,和 标签两个下拉蒙版的区别就是

  1. 票价类型没有搜索功能
  2. 标签展示有搜索功能
  3. 以上两个可以得出一个属性用于展示 showSearch 是否存在 搜索条

共同点就是

  1. 都是下拉,可以多选,选中之后的标签展示,可以删除标签
  2. 基于这几点,本组件是第二次封装了 element-ui 中 el-select 的组件,
  3. 因为该组件具有多选功能,也有分组的概念

438683ab272415e9cc1032708ab7ebd7.png

其实很简单,主要是拿以下代码进行改造

<template>
  <el-select v-model="value" placeholder="请选择">
    <el-option-group
      v-for="group in options"
      :key="group.label"
      :label="group.label">
      <el-option
        v-for="item in group.options"
        :key="item.value"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-option-group>
  </el-select>
</template>

<script>
  export default {
    
    data() {
    
      return {
    
        options: [{
    
          label: '热门城市',
          options: [{
    
            value: 'Shanghai',
            label: '上海'
          }, {
    
            value: 'Beijing',
            label: '北京'
          }]
        }, {
    
          label: '城市名',
          options: [{
    
            value: 'Chengdu',
            label: '成都'
          }, {
    
            value: 'Shenzhen',
            label: '深圳'
          }, {
    
            value: 'Guangzhou',
            label: '广州'
          }, {
    
            value: 'Dalian',
            label: '大连'
          }]
        }],
        value: ''
      }
    }
  }
</script>

以下是我们二次封装的组件

75eaf2c03bcf61487530816583aecf1d.png

478507102aadc3e57342a9e10bc2bfb4.png

事件分发的 utils.js

export default {
    
  methods: {
    
    /**
     * 查找指定名称的父级组件后,触发自定义事件
     * @param {*} componentName 父级组件名称
     * @param {*} eventName //自定义事件名称
     * @param {*} params //参数
     */
    dispatch(componentName, eventName, params) {
    
      var parent = this.$parent || this.$root
      var name = parent.$options.componentName
      while (parent && (!name || name !== componentName)) {
    
        parent = parent.$parent
        if (parent) {
    
          name = parent.$options.componentName
        }
      }
      if (parent) {
    
        parent.$emit.apply(parent, [eventName].concat(params))
      }
    },
    /**
     * 根据rules自定义验证方法
     * @param {*} rules 验证规则
     * @param {*} model form中的model
     */
    customValidator(rules, model) {
    
      if (rules) {
    
        rules = rul
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值