基于element-ui的多选下拉框和tag标签的二次封装

前言:

今年这大半年我主要负责公司的后台教务管理的开发,这个管理系统目前主要是给公司的内部人员去配置公司的核心项目(例如:熊猫小课)的所有数据,例如课程的配置、课程期数的配置、课程版本的配置、活动的配置、课程安排表、管理员的权限配置、物流的管理、退款管理、学员咨询管理等功能。因为一开始这个教务系统的原型设计就是基于element-ui 1.4.13的版本设计的,前端一开始为了和设计稿给的原型保持一致,项目中也是基于element-ui 1.4.13在开发,现在这个版本官方已经停止维护了,我们曾经尝试过去升级element-ui到最新版本,但是发现升级后的版本和旧版本的样式有些模块改动太大,微调的成本太高,最终放弃了升级。所以后续基于后台管理element-ui部分的总结,我都是基于的element-ui 1.4.13的总结。

需要实现的效果:

选中时就显示复选框,不选中时不显示复选框

element-ui中提供的多选ui组件:

不符合我们的需求,所以我们需要想办法自己封装,但如何做呢?

element-ui中提供的其他组件:

我们可不可以将element-ui中提供的tag组件、复选框组件和普通的下拉框组件组合呢?因为这三个组合起来正是我们想要的效果。

select组件中我们可以自定义下拉框中的数据展示的样式:

如何组合呢?

 1 <el-select class="dropdown-list" v-model="selectedValue" placeholder="请选择">
 2     <el-option
 3       v-for="item in options"
 4       :key="item.plan_id"
 5       :class="{active: isActive(item)}"
 6       :label="item.plan_name"
 7       :value="item.plan_id">
 8       <el-checkbox
 9         v-if="isActive(item)"
10         :label="item.plan_name"
11         :disabled="isActive(item)"
12         :checked="isActive(item)"
13         @change="valueChange(item)">
14       </el-checkbox>
15       <div v-else v-text="item.plan_name" @click="selectItem(item)"></div>
16     </el-option>
17   </el-select>

明白可以怎么做就发现很简单了,就是重写el-option组件,将下拉框中默认的样式用自定义的样式覆盖掉,el-option组件中下拉框的样式是定义在一个slot的插槽中的,我们在slot中定义我们自己的ui布局。

这个组件我们只需要从外部拿两个变量值:下拉框的选项、和被选择的选项值。


<template>

<div class="dropdown-wrap">

<el-select class="dropdown-list" v-model="selectedValue" placeholder="选择开学课程期数">

<el-option

v-for="item in options"

:key="item.plan_id"

:class="{active: isActive(item)}"

:label="item.plan_name"

:value="item.plan_id">

<el-checkbox

v-if="isActive(item)"

:label="item.plan_name"

:disabled="isActive(item)"

:checked="isActive(item)"

@change="valueChange(item)">

</el-checkbox>

<div v-else v-text="item.plan_name" @click="selectItem(item)"></div>

</el-option>

</el-select>

</div>

</template>

<script>

export default {

props: {

options: Array,

selected: Array

},

mounted() {

this.selectedItems = this.selected;

},

watch: {

selected: {

handler(val) {

this.selectedItems = val;

},

deep: true

},

methods: {

//选中

selectItem(item) {

// debugger

let newArr = JSON.parse(JSON.stringify(this.selectedItems));

let newItem = JSON.parse(JSON.stringify(item));

newItem.type = "primary";

newItem.name = item.plan_name;

newItem.plan_id = item.plan_id;

newItem.version_id = item.version_id;

newArr.push(newItem);

this.selectedItems = newArr;

this.$emit("valueChange",JSON.parse(JSON.stringify(newItem)), newArr);

},

//取消选择

valueChange(item) {

this.$emit(‘del‘, item)

},

isActive(data) {

// debugger

return this.selectedItems.some(item => item.plan_id === data.plan_id);

},

}

};

</script>

<style lang="scss" scoped>

.active {

display: block;

}

.cpt-dropdown-list {

display: inline-block;

.dropdown-link {

color: #409eff;

cursor: pointer;

}

}

.dropdown-list {

.el-select-dropdown {

display: none !important;

}

}

.el-dropdown-menu.cpt-dropdown-list-wrap {

min-width: 188.09px;

left: 345px !important;

}

</style>

<style lang="scss">

// .dropdown-list {

.el-select-dropdown__item.selected {

background-color: rgba(color: #409eff, opacity: 0.1);

color: #48576a;

}

.el-select-dropdown__item.selected.hover {

//

background-color: rgba(color: #409eff, opacity: 0.1);

color: #48576a;

}

// }

</style>

 

总结:写完之后就发现还是很简单的,记得当时写的时候都没有思路,仔细想想,质疑一下element-ui的选择框的下拉可以自定义样式吗,然后去仔细看官方文档,发现确实可以做到,思路就打开了。先想应该怎么做,先假设,再去验证,这样才能快速得到结果。

原文地址:https://www.cnblogs.com/yy95/p/9493422.html

时间: 2024-12-09 21:48:53

基于element-ui的多选下拉框和tag标签的二次封装的相关文章

获取多选下拉框(select标签设置multiple属性)的值

原文链接:https://blog.csdn.net/qq846294282/article/details/82427002   (侵删) <select multiple>不能直接获取value,需要借助该元素的options属性.如下: <select id="select" multiple> <option value="1">1111</option> <option value="2&qu

query多选下拉框插件 jquery-multiselect(修改)

其实网上关于该控件的使用教程已经很多了,其中 query多选下拉框插件 jquery-multiselect Jquery多选下拉列表插件jquery multiselect功能介绍及使用 这2个的介绍已经比较详细了,尤其是第二个有扩展MyValues函数,只是扩展有些bug,这里我在提出一些我的扩展,我们应该把multiValues属性定义在options里面,让每个multiselect控件都有自己的multiValues属性.我这里还需要一个获取text的方法.有关Myvalues和Myt

多选下拉框带搜索(aps.net)

自己写了一个带搜索功能的多选下拉框,为了要获取值,就没有封装插件,实现思路 1.一个文本框 做搜索 2.一个文本框显示选中文本,一个隐藏控件存值 3.一个div里面绑定CheckBoxList控件(这里,你也可以请求后直接插入checkbox) 代码 1.一个变量把div的html存起来 2.选中就加到文本框,取消就减掉 //选中记录,反选删除 $("#divChkList :checkbox").each(function () { $(this).click(function ()

Html 多选下拉框

1.css文件 span.dropList {display:inline-block; height:20px;border:1px solid #ccc;  cursor:pointer; background:url(../images/xj.png) #fff no-repeat center right; font-size:12px; line-height:20px;padding-right:10px; position:relative;} span.dropList .Che

页面多选下拉框 jquery.multiple.select

1.首先引用jquery.multiple.select.js.multiple-select.css 2.在页面select下拉列表里面加一个multiple="multiple" <select name="nimbusHost" id="nimbusHost" multiple="multiple"> <c:forEach items="${stormIps}" var="

Extjs4.2 多选下拉框

//多选下拉框 Ext.define('MDM.view.custom.MultiComboBox', { extend: 'Ext.form.ComboBox', alias: 'widget.multicombobox', xtype: 'multicombobox', initComponent: function() { this.multiSelect = true; this.listConfig = { itemTpl: Ext.create('Ext.XTemplate', '<

ExtJs5.1多选下拉框CheckComb

ExtJs这么多个版本了,可就是不提供多选下拉框,老外不用这个玩意吗? 5都出来这么久了,新写的项目就用5吧,把以前Extjs4.2的时搜到前人的CheckComb改巴改巴,能用了就赶紧贴上来,没有仔细测试各种情况. Ext.define('Ext.ux.CheckCombo', { extend : 'Ext.form.field.ComboBox', alias : 'widget.checkcombo', multiSelect : true, allSelector : false, n

MVC实现多选下拉框

借助Chosen Plugin可以实现多选下拉框. 选择多项: 设置选项数量,比如设置最多允许2个选项: 考虑到多选下拉<select multiple="multiple"...></select>选中项是string数组,Model应该这样设计: using System.Collections.Generic; using System.Web.Mvc; namespace MvcApplication1.Models { public class Car

c# 复选下拉框

引用dll: http://pan.baidu.com/s/1qXa97UO 自定义类: namespace TMI_S { /// <summary> /// 功能描述:自定义多选下拉框 /// 作 者:huangzh /// 创建日期:2016-01-04 11:57:13 /// 任务编号: /// </summary> public class MultiComboBox : ComboBox { public TreeView lst = new TreeView();