常规的el-select中change事件返回值,只有key返回,业务上有些需求有需要获取到value值,所以简单的封装了一下,使返回中包含key,value,obj三个值,基本上可以满足大部分的需求

封装代码

<template>
<div>
<el-select
v-model="v"
clearable
:placeholder="'请选择'+placeholder"
@change="change"
:multiple="multiple"
>
<el-option
v-for="item in options"
:key="item[value]"
:label="item[label]"
:value="item[value]"
:disabled="item[disabled]"
></el-option>
</el-select>
</div>
</template> <script>
export default {
computed: {
v: {
get() {
return this.val;
},
set(e) {
this.$emit("update:val", e);
}
}
},
props: {
val: {
type: [String, Array],
default() {
return null;
}
},
options: {
type: [Object, Array],
default() {
return null;
}
},
multiple: {
type: Boolean,
default: false
},
label: {
type: String,
default: "label"
},
value: {
type: String,
default: "value"
},
placeholder: {
type: String,
default: ""
},
disabled: {
type: String,
default: "disabled"
}
},
methods: {
change(e) {
let options = this.options;
//e.length 只有当数组中存在值才进入,不加e.length的话清空时也会进入
if (Array.isArray(e) && e.length > 0) {
//多选时
const item = [];
const label = [];
for (const i of e) {
for (const j of options) {
if (j[this.value] == i) {
label.push(j[this.label]);
item.push(j);
}
}
}
this.$emit("change", e, label, item);
} else {
//非多选时
options.find(v => {
if (v[this.value] == e) {
this.$emit("change", e, v[this.label], v);
return;
}
});
}
}
}
};
</script> <style>
</style>

调用代码

<template>
<div>
<c-select :options="options" :val.sync="val" @change="test"></c-select>
</div>
</template> <script>
export default {
methods: {
test(a, b, c) {
console.log("test -> c", c);
console.log("test -> b", b);
console.log("test -> a", a);
},
},
data() {
return {
val: "1",//可以给默认值
options: [
{
label: "测试1",
value: "1"
},
{
label: "测试2",
value: "2"
}
]
};
}
};
</script>
v-model版
<template>
<div>
<el-select
:value="value"
clearable
:placeholder="'请选择'+placeholder"
@change="change"
:multiple="multiple"
>
<el-option
v-for="item in options"
:key="item[optionValue]"
:label="item[optionLabel]"
:value="item[optionValue]"
:disabled="item[disabled]"
></el-option>
</el-select>
</div>
</template> <script>
export default {
model: {
event: "change"
},
props: {
value: {
type: [String, Array],
default() {
return null;
}
},
options: {
type: [Object, Array],
default() {
return null;
}
},
multiple: {
type: Boolean,
default: false
},
optionLabel: {
type: String,
default: "label"
},
optionValue: {
type: String,
default: "value"
},
placeholder: {
type: String,
default: ""
},
disabled: {
type: String,
default: "disabled"
}
},
methods: {
change(e) {
let options = this.options;
//清空
if (e.length === 0) {
//清空时会再次调用change方法,调用方法处需做非空判断,以免未知情况发生
this.$emit("change", "", "", "");
this.$emit("clear");
return;
}
if (Array.isArray(e)) {
//多选时
const item = [];
const label = [];
for (const i of e) {
for (const j of options) {
if (j[this.optionValue] == i) {
label.push(j[this.optionLabel]);
item.push(j);
}
}
}
this.$emit("change", e, label, item);
} else {
//非多选时
options.find(v => {
if (v[this.optionValue] == e) {
this.$emit("change", e, v[this.optionLabel], v);
return;
}
});
}
}
}
};
</script> <style>
</style>
调用
 <c-select v-model="val" :options="options" @change="test"></c-select>

el-select的简单封装,使其返回值中包含key,value,obj 三种值的更多相关文章

  1. python之路53 ajax补充返回序列化数据,多对多创建三种方式,django内置序列化组件(drf前身),批量操作数据,自定义分页器,form组件

    ajax补充说明 主要是针对回调函数args接收到的响应数据 1.后端request.is_ajax() 用于判断当前请求是否由ajax发出 2.后端返回的三板斧都会被args接收不再影响整个浏览器页 ...

  2. Substring with Concatenation of All Words, 返回字符串中包含字符串数组所有字符串元素连接而成的字串的位置

    问题描述:给定一个字符数组words,和字符串s,返回字符数组中所有字符元素组成的子串在字符串中的位置,要求所有的字符串数组里的元素只在字符串s中存在一次. 算法分析:这道题和strStr很类似.只不 ...

  3. javascript篇-知道value值,返回对象中的key值

    前提是,value值是唯一的,业务中有这样一个需求,代码如下:

  4. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  5. Spring jdbc 对象Mapper的简单封装

    一般查询实体的时候,都需要这么使用/**      * 根据id查询      *       * @return      */     public Emp queryEmpById(Intege ...

  6. Spring Boot将Mybatis返回结果转为驼峰的三种实现方式

    本文不再更新,可能存在内容过时的情况,实时更新请访问原地址:Spring Boot将Mybatis返回结果转为驼峰的三种实现方式: 我们通常获取Mybatis返回的数据结果时想要将字段以驼峰的形式返回 ...

  7. ADO简单封装(MFC)

    简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...

  8. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

  9. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  10. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

随机推荐

  1. NVME(学习笔记二)—CMB

    什么是CMB 在NVMe Express 1.2 Spec中开始支持一个特性,那就是CMB(Controller Memory Buffer),是指SSD控制器内部的读写存储缓冲区,与HMB(Host ...

  2. flutter打包android的一些配置修改(解决白屏,视频闪退)

    1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...

  3. vscode配置远程开发环境

    下载vscode 下载好了后,先安装两个插件,商店里面搜索"Chinese",中文语言包, "python"安装包,安装好后重启vscode. 本地的pytho ...

  4. itsdangerous模块的使用

    简介 生成临时身份令牌(通过邮件让用户注册激活的时候地址当中带有用户的信息.但是信息一般都是敏感信息,而且还想让它具有时效性,所以就可以选择itsdangerous模块 官网:https://itsd ...

  5. 记录一个错误:Traceback (most recent call last): from pip._internal.cli.main import main ImportError: No module named pip._internal.cli.main

    问题描述 在安装yaml时得到报错如下 root@ag-virtual-machine:/home/ag/test_script# pip install pyyaml Traceback (most ...

  6. mac环境下安装python3的requests包

    大家知道,mac环境默认安装的都是python2,自己装好python3之后,怎么使用pip来安装到python3下的包呢? 解决方法:pip3 install requests

  7. 监控系统open-falcon安装部署

    目录 官方文档 安装包下载地址 环境准备 安装redis 安装mysql 安装git 安装GO 安装后台 部署前端: 邮件报警 修改ALARM配置 修改报警接口 报警测试邮件展示 Q&A 官方 ...

  8. c++复习笔记——STL(vector)

    c++-----STL容器系列(1) vector 1 介绍 Vector是stl容器中一种常见的容器 ,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vecto ...

  9. [linux 爬坑] 几个linux发行版尝试和令人崩溃的ssr安装体验

    最近电脑上的manjaro好像出了问题,长时间不用就会死机.也懒得追究原因了,正好决定尝试几个发行版.首先尝试安装银河麒麟    这个发行版实际上就是ubuntu,甚至源什么的都是ubuntu的,也不 ...

  10. F12 Preserve log 查看之前的api接口返回数据,只有火狐浏览器能用

    F12 Preserve log 查看之前的api接口返回数据,只有火狐浏览器能用