w-form-select.vue(自定义下拉框组件)
文章目录
- 1、w-form-select.vue 组件中每个属性的含义
- 2、实例
- 3、源代码
1、w-form-select.vue 组件中每个属性的含义
好的,我们来详细解释 w-form-select.vue
组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关:
属性解释表格:
属性名 | 类型 | 默认值 | 含义 | 与后端字段直接相关性 |
---|---|---|---|---|
label | string | '' | 表单项的标签文本,显示在输入框左侧。 | 否 |
prop | string | '' | 表单验证的关键。 对应后端数据模型中的一个字段名。 主要用于 el-form 的表单验证。 | 是 |
labelWidth | string | '160px' | 标签的宽度。 | 否 |
labelAlign | string | 'right' | 标签文本的对齐方式。 | 否 |
tip | string | '' | 鼠标悬停在标签上的提示文本。 | 否 |
operateType | string | '' | 操作类型,用于判断组件的显示状态(如 'add' , 'edit' , 'view' )。 | 否 |
inputWidth | string | '100%' | 控制内部 el-select 组件的宽度。 可以是像素值、百分比或其他有效 CSS 宽度值。 | 否 |
value | any | '' | 组件的值。这个值通常直接对应后端字段的值。 使用 v-model 双向绑定此值。 | 是 |
multiple | boolean | false | 是否允许多选。如果为 true ,则 value 为数组;否则 value 为单个值。 | 否 |
list | any[] | [] | 下拉选择框的数据源。通常是一个对象数组,其中每个对象表示一个选项。 | 间接相关 |
optionLabel | string | '' | 指定 list 中哪个属性的值作为下拉选项的标签文本显示。 | 否 |
optionValue | string | 'value' | 指定 list 中哪个属性的值作为下拉选项的值。 | 是 |
placeholder | string | '' | 下拉选择框的占位符文本。 | 否 |
inputEnd | string | '' | 在输入框后附加的文本或元素。 | 否 |
allowCreate | boolean | false | 是否允许用户创建新的选项。 | 否 |
defaultFirstOption | boolean | false | 是否在输入框有值的时候,默认选择第一个匹配的选项。 | 否 |
详细解释:
-
与后端字段直接相关:
prop
: 这个属性的值通常与后端数据模型的字段名称对应, 用于表单验证, 例如你在后端有一个userType
的字段,那么你可以设置prop="userType"
。prop
的值不是直接传递给后端,而是用来匹配 rules, 用于表单校验。value
: 组件的值,例如用户选择了普通用户
,value
通常是1
, 最终会和表单其他数据一起提交给后端。value
的值直接对应后端字段的值,例如,如果后端有一个userType
字段, 你的表单提交数据中也需要userType: 1
。v-model
直接绑定了value
。- 如果
:multiple="true"
:value
为[1, 3, 5]
等数组, 对应后端可能也会是这样的数组结构,例如"relatedIds":[1,3,5]
。 - 如果
:multiple="false"
:value
为1
, 对应后端字段值, 例如userType: 1
。
- 如果
optionValue
: 指定list
中哪个属性的值作为下拉选项的值传递给后端, 例如你的list
为[{id: 1, label: '普通用户'}]
, 那么optionValue="id"
表明,你选择了普通用户
后,id
为1
的值,会被作为value
提交给后端。
-
与后端字段间接相关:
list
: 虽然list
本身不会直接提交给后端,但它的数据通常来源于后端接口返回的数据。例如,你通常会从后端接口获取一个 用户类型列表,作为你的list
的数据来源。
-
与后端字段无直接关系:
- 其他属性,如
label
,labelWidth
,tip
,operateType
,inputWidth
,optionLabel
,placeholder
,inputEnd
,allowCreate
,defaultFirstOption
, 等, 主要用于控制前端 UI 的展示,与后端字段没有直接的对应关系。
- 其他属性,如
总结:
这个表格清晰地展示了 w-form-select
组件中每个属性的作用,以及它们与后端字段的关系。 请记住, prop
用作表单验证, value
是与后端字段值直接对应的, 而 optionValue
指定了传递给后端的值。 其他属性主要用于组件的 UI 展示和交互。
2、实例
<w-form-select v-model="form.relatedIds" label="关联识别点" label-width="120px" :operate-type="operateType":list="identifies" option-label="description" option-value="id" :multiple="true" input-width="100%"@visible-change="handleVisibleChange"/>
在这个例子中,v-model="form.relatedIds"
这个属性对应着 w-form-select
组件的 value
。
详细解释:
-
v-model
的作用:v-model
是 Vue.js 中用于双向数据绑定的语法糖。 它实际上是v-bind:value
和@input
(或者@change
, 如果是<select>
组件) 的简写形式。 -
v-model="form.relatedIds"
的含义:- 读取值: 组件初始化时,会读取
form.relatedIds
变量的值,并显示在w-form-select
组件中。 - 更新值: 当用户在
w-form-select
组件中选择了新的选项时,组件的值会自动更新到form.relatedIds
变量。 - 双向绑定: 实现了
w-form-select
组件的value
属性和form.relatedIds
变量之间的双向绑定。
- 读取值: 组件初始化时,会读取
-
w-form-select
的value
:-
在
w-form-select
组件的代码中,我们看到了v-model="val"
, 并且在value
发生变化的时候, 将其更新到val
变量。@Watch('value')watchValue(v: any) {this.val = v}
并且
el-select
组件使用了v-model="val"
:<el-select v-model="val" ... />
-
当
w-form-select
组件的值发生变化的时候,会触发@input
事件,并且传递组件的值, 最终触发的是w-form-select
组件的@input
事件:@input="value => $emit('input', value)"
-
-
所以
v-model="form.relatedIds"
实际上是以下代码的简写:<w-form-select:value="form.relatedIds"@input="value => form.relatedIds = value"label="关联识别点"label-width="120px":operate-type="operateType":list="identifies"option-label="description"option-value="id":multiple="true"input-width="100%"@visible-change="handleVisibleChange" />
-
form.relatedIds
的值:- 由于
:multiple="true"
, 所以form.relatedIds
的值是一个数组, 包含了用户选择的多个id
值, 例如[1, 3, 5]
。 如果:multiple="false"
, 则是一个单独的值, 例如1
。
- 由于
-
后端关系:
form.relatedIds
最终会传递到后端, 对应后端数据模型的字段。
总结:
在你的代码示例中, w-form-select
组件的 value
属性的值被 v-model="form.relatedIds"
所控制。 form.relatedIds
变量存储了组件的当前值,并且实现了双向数据绑定。
因此, 在你这个例子中 v-model="form.relatedIds"
就是对应 w-form-select
组件的 value
属性。
3、源代码
<!-- src/components/DialogForm/func/w-form-select.vue -->
<template><div class="wrap"><div class="box"><el-form-item :label="label" :prop="prop" :label-width="labelWidth"><div slot="label" :style="`text-align: ${labelAlign};`"><span>{{ label }}<el-tooltip class="item" effect="dark" :content="tip || label || placeholder" placement="bottom-start"><i class="el-icon-warning-outline" /></el-tooltip></span></div><span v-if="operateType === 'view'"><template v-if="multiple">{{ list && list.length && list.filter(o => val.includes(o[optionValue])).map(o => o[optionLabel]).join(',')}}</template><template v-else><!-- {{ getSelectLabel(val) }} -->{{ list && list.length && list.find(o => val === o[optionValue]) && list.find(o => val ===o[optionValue])[optionLabel] }}</template></span><div v-else class="input-container"><!-- 这里有一个 v-else --><el-select v-model="val" :multiple="multiple" filterable clearable :placeholder="placeholder || label || tip":allow-create="allowCreate" :default-first-option="defaultFirstOption":style="inputWidth ? `width: ${inputWidth};` : `width: 100%;`" @input="value => $emit('input', value)"@change="value => $emit('change', value)"@visible-change="value => $emit('visible-change', value)"><el-option v-if="list.length" :label="` `" :value="` `" /><el-option v-for="(item, i) in list" :key="'' + item[optionLabel] + item[optionValue] + i":label="item[optionLabel]" :value="item[optionValue]"/></el-select></div><div class="append-slot"><!-- 添加一个容器包裹插槽 --><slot name="append"></slot> <!-- 插槽用于放置图片 --></div><template v-if="inputEnd"> </template>{{ inputEnd }}</el-form-item></div></div>
</template>
<script lang="ts">
import { Component, Vue, Prop, Emit, Watch } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import { UserModule } from '@/store/modules/user'@Component({name: 'w-form-input',components: {}
})export default class extends Vue {@Prop({ default: '' })public label!: string@Prop({ default: '' })public prop!: string@Prop({ default: '160px' })public labelWidth: string@Prop({ default: 'right' })public labelAlign: string@Prop({ default: '' })public tip?: string@Prop({ default: '' })public operateType!: string@Prop({ default: false })@Prop({ default: '100%' })public inputWidth?: string@Prop({ default: '' })public value?: any@Prop({ default: false })public multiple: boolean@Prop({ default: () => [] })public list!: any@Prop({ default: '' })public optionLabel: string@Prop({ default: 'value' })public optionValue: string@Prop({ default: '' })public placeholder?: string@Prop({ default: '' })public inputEnd?: string@Prop({ default: false })public allowCreate?: boolean@Prop({ default: false })public defaultFirstOption?: boolean@Watch('list')watchList(v: any) {this.selList = v}@Watch('value')watchValue(v: any) {this.val = v}private multipleFlag: boolean = falseprivate selList: any = this.listprivate val: any = this.value
}
</script>
<style scoped lang="scss">
.wrap {width: 100%;.box {width: 100%;position: relative;overflow: visible;}.input-container {position: relative; /* 确保下拉框的弹出层基于此容器定位 */display: inline-block; /* 让下拉框和图片在同一行 */}.append-slot {position: absolute; /* 将图片绝对定位 */left: 15%; /* 图片放置在下拉框右侧 */top: 53%; /* 垂直居中 */transform: translateY(-50%); /* 确保垂直居中 */margin-left: 10px; /* 图片与下拉框的间距 */z-index: 1; /* 确保图片在下拉框之上 */}/* 确保 el-select 的下拉菜单不受干扰 */.el-select {width: 200px; /* 设置默认宽度 */position: relative; /* 确保下拉框的弹出层基于此容器定位 */}.el-select-dropdown {z-index: 9999 !important; /* 确保下拉菜单在最上层 */}}
</style>
相关文章:

w-form-select.vue(自定义下拉框组件)
文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…...
ovs实现lb负载均衡
负载均衡定义 负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。常见的实现方式包括: 二层负载均衡:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均…...

机器学习-核函数(Kernel Function)
核函数(Kernel Function)是一种数学函数,主要用于将数据映射到一个更高维的特征空间,以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下,通过内积操作来实…...
计算最接近的数
计算最接近的数 真题目录: 点击去查看 E B卷 100分题型 题目描述 给定一个数组X和正整数K,请找出使表达式: X[i] - X[i 1] - … - X[i K - 1] 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i. 其中&…...
【QNX】QNX侧查看内存信息的方法
在QNX实时操作系统中,🉑查看内存信息的方法有showmem、pidin、top以及hogs等👇🏻。 ① showmem 🦋🦋🦋showmem可用于显示进程的内存使用情况。 🦋🦋🦋通过…...
逐笔成交逐笔委托Level2高频数据下载和分析:20250121
逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/15NI2zLXYiczrUMQtwHgUrg?pwdbeiu 提取码: beiu Level2逐笔成交逐笔委托数据分享下载 通过Level2的逐笔成交与委托记录,这种高精度的毫秒级数据能够洞察诸多重要信息,包括庄家目的、误导性行为&am…...

AutoSar架构学习笔记
1.AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一个针对汽车行业的软件架构标准,旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元(ECU…...

2024年智慧消防一体化安全管控年度回顾与2025年预测
随着科技的飞速发展,智慧营区一体化安全管控在2024年取得了显著进展,同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大:国家对消防安全的重视程度不断提高,出台了一系列涵盖技术创新、市场应用、人才培…...
基于单片机的智能台灯设计
摘要: 方向和亮度,采用的是手动调节。而对于儿童来说,他们通常不知道如何调整以及调整到何种程度。本文设计了一款智能台灯,当有人的 台灯是用于阅读学习而设计使用的灯,一般台灯用的灯泡是白炽灯、节能灯泡以及市面上流行的护眼台灯,可以调节高度、光照的时候,可以根据…...
HJ108 求最小公倍数(Java版本)
一、试题地址 求最小公倍数_牛客题霸_牛客网 二、试题描述 描述 对于给定的两个正整数 a,b,它们的最小公倍数 lcm(a,b) 是指能同时被 a 和 b 整除的最小正整数。 求解 lcm(a,b)。 输入描述: 在一行上输入两个整数 a,b(1≦a,b≦105)。 输出描述…...

使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。
1、关于clip-vit-large-patch14模型 关于openapi开源的clip-vit-large-patch14模型的特征提取,可以参考之前的文章:Elasticsearch向量检索需要的数据集以及768维向量生成这篇文章详细介绍了模型的下载地址、使用方式、测试脚本,可以让你一步…...

实操演练第003讲-数据通途:客户端连接SQL Server的完美攻略
SQL Server简介 基本概念 SQL Server是由微软公司开发的关系型数据库管理系统。它基于SQL(Structured Query Language,结构化查询语言)来管理和操作数据。SQL Server可以存储大量结构化数据,如客户信息、订单记录、库存数据等&a…...
golang接口
1.概念 golang接口是一个动态类型和动态值的集合,定义了对象的行为,不指定实现。只要一个类型定义了接口全部的方法,就可被认为是实现接口 **动态类型:**实现接口的具体数据类型 **动态值:**实现接口的数据的值或者引…...

LeetCode:37. 解数独
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则ÿ…...

数据结构与算法之递归: LeetCode 37. 解数独 (Ts版)
解数独 https://leetcode.cn/problems/sudoku-solver/description/ 描述 编写一个程序,通过填充空格来解决数独问题数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次数字 1-9 在每一列只能出现一次数字 1-9 在每一个以粗实线分隔的 3x3 宫内…...

【氮化镓】香港科技大学陈Kevin-单片集成GaN比较器
一、引言(Introduction) GaN HEMT的重要性 文章开篇便强调了氮化镓(GaN)高电子迁移率晶体管(HEMT)在下一代功率转换系统中的巨大潜力。GaN HEMT具备高开关频率、低导通电阻、高击穿电压以及宽工作温度范围等优势,使其成为功率电子领域的热门研究对象。这些特性使得GaN…...
axios的使用总结
一、Axios 简介 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。在 Vue 项目中,它主要用于发送 HTTP 请求来获取数据(如从 API 获取数据)或者提交数据(如用户登录、注册等表单数据)。 二…...

革新未来:高效智能数字人技术引领多元化应用
随着科技的不断进步,数字人技术已逐渐成为企业数字化转型中的重要工具。数字人不仅能够优化客户体验,还可以显著提升企业运营效率。本文将详细介绍一种高性能、高质量、低延迟、快速响应以及安全稳定的数字人技术方案,帮助企业在多元化场景中…...

使用批处理文件清除系统垃圾
第一步:打开记事本,里面的命令如下 echo off echo 正在清理临时文件,请稍候...:: 清理系统临时文件 echo 清理系统临时文件... del /q /f /s "%TEMP%\*.*" del /q /f /s "%WINDIR%\Temp\*.*" rd /s /q "%WINDIR%\T…...

总结5..
#include<stdio.h> struct nb {//结构体列队 int x, y;//x为横坐标,y为纵坐标 int s, f;//s为步数,//f为方向 }link[850100]; int n, m, x, y, p, q, f; int hard 1, tail 1; int a[52][52], b[52][52], book[52][52][91]; int main() { …...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...