当前位置: 首页 > news >正文

w-form-select.vue(自定义下拉框组件)(与后端字段直接相关性)

文章目录

  • 1、w-form-select.vue 组件中每个属性的含义
  • 2、实例
  • 3、源代码

1、w-form-select.vue 组件中每个属性的含义

好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关:

属性解释表格:

属性名类型默认值含义与后端字段直接相关性
labelstring''表单项的标签文本,显示在输入框左侧。
propstring''表单验证的关键。 对应后端数据模型中的一个字段名。 主要用于 el-form 的表单验证。
labelWidthstring'160px'标签的宽度。
labelAlignstring'right'标签文本的对齐方式。
tipstring''鼠标悬停在标签上的提示文本。
operateTypestring''操作类型,用于判断组件的显示状态(如 'add', 'edit', 'view')。
inputWidthstring'100%'控制内部 el-select 组件的宽度。 可以是像素值、百分比或其他有效 CSS 宽度值。
valueany''组件的值。这个值通常直接对应后端字段的值。 使用 v-model 双向绑定此值。
multiplebooleanfalse是否允许多选。如果为 true,则 value 为数组;否则 value 为单个值。
listany[][]下拉选择框的数据源。通常是一个对象数组,其中每个对象表示一个选项。间接相关
optionLabelstring''指定 list 中哪个属性的值作为下拉选项的标签文本显示。
optionValuestring'value'指定 list 中哪个属性的值作为下拉选项的值。
placeholderstring''下拉选择框的占位符文本。
inputEndstring''在输入框后附加的文本或元素。
allowCreatebooleanfalse是否允许用户创建新的选项。
defaultFirstOptionbooleanfalse是否在输入框有值的时候,默认选择第一个匹配的选项。

详细解释:

  • 与后端字段直接相关:

    • prop: 这个属性的值通常与后端数据模型的字段名称对应, 用于表单验证, 例如你在后端有一个 userType 的字段,那么你可以设置 prop="userType"prop 的值不是直接传递给后端,而是用来匹配 rules, 用于表单校验。
    • value: 组件的值,例如用户选择了 普通用户value 通常是 1, 最终会和表单其他数据一起提交给后端。 value 的值直接对应后端字段的值,例如,如果后端有一个 userType 字段, 你的表单提交数据中也需要 userType: 1v-model 直接绑定了 value
      • 如果 :multiple="true" value[1, 3, 5] 等数组, 对应后端可能也会是这样的数组结构,例如 "relatedIds":[1,3,5]
      • 如果 :multiple="false" value1, 对应后端字段值, 例如 userType: 1
    • optionValue: 指定 list 中哪个属性的值作为下拉选项的值传递给后端, 例如你的 list[{id: 1, label: '普通用户'}], 那么 optionValue="id" 表明,你选择了 普通用户 后, id1 的值,会被作为 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-selectvalue:

    • 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">&nbsp;&nbsp;&nbsp;&nbsp;</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 组件中每个属性的含义 好的&#xff0c;我们来详细解释 w-form-select.vue 组件中每个属性的含义&#xff0c;并用表格列出它们是否与后端字段直接相关&#xff1a; 属性解释表格&…...

【JVM】垃圾收集器详解

你将学到 1. Serial 收集器 2. ParNew 收集器 3. Parallel Scavenge 收集器 4. Serial Old 收集器 5. Parallel Old 收集器 6. CMS 收集器 7. G1 收集器 在 Java 中&#xff0c;垃圾回收&#xff08;GC&#xff09;是自动管理内存的一个重要机制。HotSpot JVM 提供了多种…...

python创建一个httpServer网页上传文件到httpServer

一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…...

【Maui】提示消息的扩展

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 消息扩展库3.2 消息提示框使用3.3 错误消息提示使用3.4 问题选择框使用 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移…...

租车骑绿岛

租车骑绿岛 真题目录: 点击去查看 E 卷 100分题型 题目描述 部门组织绿岛骑行团建活动。租用公共双人自行车&#xff0c;每辆自行车最多坐两人&#xff0c;最大载重M。给出部门每个人的体重&#xff0c;请问最多需要租用多少双人自行车。 输入描述 第一行两个数字m、n&…...

Pytorch - YOLOv11自定义资料训练

►前言 本篇将讲解目前最新推出的YOLOv11搭配Roboflow进行自定义资料标注训练流程&#xff0c;透过Colab上进行实作说明&#xff0c;使大家能够容易的了解YOLOv11的使用。 ►YOLO框架下载与导入 ►Roboflow的资料收集与标注 进行自定义资料集建置与上传 透过Roboflow工具进行…...

微服务与docker

准备工作 在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备: Centos7的环境及一个好用的SSH客户端装好Docker会使用Docker如果是学习过上面Doc…...

1.23 消息队列

使用消息队列&#xff0c;实现两个终端相互聊天 程序代码&#xff1a; w1.c #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h&g…...

【华为路由的arp配置】

华为路由的arp配置 ARP&#xff1a;IP地址与MAC地址的映射。 R1: g0/0/0:10.1.1.254/24 g0/0/1:10.1.2.254/24 PC1: 10.1.1.1/16 PC2: 10.1.1.2/16 PC3: 10.1.2.3/16 动态ARP 查看PC1的arp表&#xff0c;可以看到&#xff0c;列表为空。 查看R1的arp表 在PC3上ping命令测…...

绘制决策树的尝试1

代码复制 import pydotplus 复制 - 这一行代码用于导入pydotplus模块&#xff0c;这是一个用来在Python中创建图形的工具。2. python from IPython.display import Image 这一行代码用于从IPython显示模块中导入Image类&#xff0c;它允许我们在Jupyter笔记本中显示图像。…...

概率论里的特征函数,如何用卷积定理去理解

概率论里的特征函数&#xff0c;如何用卷积定理去理解_哔哩哔哩_bilibili...

Spring 是如何解决循环依赖问题

Spring 框架通过 三级缓存 机制来解决循环依赖问题。循环依赖是指两个或多个 Bean 相互依赖&#xff0c;形成一个闭环&#xff0c;例如 Bean A 依赖 Bean B&#xff0c;而 Bean B 又依赖 Bean A。Spring 通过提前暴露未完全初始化的 Bean 来解决这个问题。 以下是 Spring 解决…...

Linux 目录操作详解

Linux目录操作详解 1. 获取当前工作目录1.1 getcwd()1.2 get_current_dir_name() 2. 切换工作目录2.1 chdir() 3. 创建和删除目录3.1 mkdir()3.2 rmdir() 4. 获取目录中的文件列表4.1 opendir() 打开目录4.2 readdir() 读取目录内容4.3 closedir() 关闭目录 5. dirent 结构体6.…...

Elasticsearch的经典面试题及详细解答

以下是一些Elasticsearch的经典面试题及详细解答&#xff1a; 一、基础概念与原理 什么是Elasticsearch&#xff1f; 回答&#xff1a; Elasticsearch是一个基于Lucene的分布式搜索引擎&#xff0c;提供了RESTful API&#xff0c;支持多租户能力。它能够快速、近实时地存储、搜…...

Linux-arm(1)ATF启动流程

Linux-arm(1)ATF启动流量 Author&#xff1a;Once Day Date&#xff1a;2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档&#xff1a; ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…...

C#编程:List.ForEach与foreach循环的深度对比

在C#中&#xff0c;List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作&#xff0c;但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名&#xff1a;public void ForEach(Action<T> action)类型&#xff1a;…...

C语言文件操作:标准库与系统调用实践

目录 1、C语言标准库文件操作 1.1.题目要求&#xff1a; 1.2.函数讲解&#xff1a; fopen 函数原型 参数 常用的打开模式 返回值 fwrite函数 函数原型 参数 返回值 注意事项 fseek函数 函数原型 参数 返回值 fread函数 函数原型 参数 返回值 fclose 函数…...

代码随想录 栈与队列 test 7

347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 首先想到哈希&#xff0c;用key来存元素&#xff0c;value来存出现次数&#xff0c;最后进行排序&#xff0c;时间复杂度约为o(nlogn)。由于只需求前k个&#xff0c;因此可以进行优化&#xff0c;利用堆来维护这…...

C语言练习(21)

有一行电文&#xff0c;已按下面规律译成密码&#xff1a; A→Za→Z B→Yb→y C→Xc→X 即第1个字母变成第26个字母&#xff0c;第2个字母变成第25个字母&#xff0c;第i个字母变成第&#xff08;26-i十1&#xff09;个字母。非字母字符不变。假如已知道密码是Umtorhs&…...

智能手机“混战”2025:谁将倒下而谁又将突围?

【潮汐商业评论原创】 “去年做手机比较艰难&#xff0c;几乎每个品牌都在调价、压货&#xff0c;像华为这种以前都不给我们分货的厂商&#xff0c;也开始成为我的主要库存。不过今年开头比较好&#xff0c;20号国补一开始&#xff0c;店里的人流和手机销量就明显涨了不少&…...

“AI人工智能+”政务一网通办多智能体协同建设方案:五层两体系总体架构、数据与安全体系、信创适配与实施运维

该方案是一份成熟的技术蓝图&#xff0c;它不仅仅是将AI简单叠加到政务系统&#xff0c;而是通过“多智能体协同”重构了业务组织逻辑。方案详细定义了从语料治理、模型微调、Agent协作、信创适配到安全合规的全链路工程细节&#xff0c;具有极强的实操性与前瞻性&#xff0c;适…...

LumiPixel实战:快速生成高清像素人像,内置‘一键净化‘解决内存不足

LumiPixel实战&#xff1a;快速生成高清像素人像&#xff0c;内置一键净化解决内存不足 1. 认识LumiPixel&#xff1a;像素艺术的AI新生代 LumiPixel: Canvas Quest是一款融合了现代AI技术与复古像素美学的创意工具。它基于Z-Image扩散模型&#xff0c;专为生成高清像素风格人…...

构建企业级AI客服系统:从知识库集成到无缝转人工的实战指南

1. 企业级AI客服系统架构设计 第一次搭建AI客服系统时&#xff0c;我犯了个典型错误——直接调用大模型API就开始开发前端界面。结果上线后才发现&#xff0c;当用户量超过50人时响应速度直线下降&#xff0c;转人工功能更是形同虚设。这个教训让我明白&#xff0c;企业级系统必…...

如何快速配置跨平台鼠标连点器:终极效率提升指南

如何快速配置跨平台鼠标连点器&#xff1a;终极效率提升指南 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;操作直…...

课灵h5p-标签页 (Tabs)教程

标签页 (Tabs)教程 标签页 (Tabs) 是一种高效的内容容器&#xff0c;通过水平切换的选项卡界面来组织信息。它允许你在同一页面空间内并行展示多个同层级的主题&#xff08;如不同类别的资源、不同语言的版本&#xff09;&#xff0c;帮助学习者按需浏览&#xff0c;保持界面整…...

mysql进阶--锁

锁的概述: 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…...

颠覆式项目管理工具GanttProject:让团队协作效率提升300%的开源解决方案

颠覆式项目管理工具GanttProject&#xff1a;让团队协作效率提升300%的开源解决方案 【免费下载链接】ganttproject Official GanttProject repository 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject GanttProject是一款完全免费的开源甘特图工具&#xff…...

TOAST UI Chart折线图实战:实时数据更新与同步工具提示完整指南

TOAST UI Chart折线图实战&#xff1a;实时数据更新与同步工具提示完整指南 【免费下载链接】tui.chart &#x1f35e;&#x1f4ca; Beautiful chart for data visualization. 项目地址: https://gitcode.com/gh_mirrors/tu/tui.chart TOAST UI Chart是一款功能强大的数…...

Marked.js 终极指南:为什么这是现代 Web 开发中最快的 Markdown 解析器?

Marked.js 终极指南&#xff1a;为什么这是现代 Web 开发中最快的 Markdown 解析器&#xff1f; 【免费下载链接】marked A markdown parser and compiler. Built for speed. 项目地址: https://gitcode.com/gh_mirrors/ma/marked 在当今内容驱动的 Web 开发世界中&…...

5分钟打造现代化Windows提示界面:ModernFlyouts彻底改变你的系统体验

5分钟打造现代化Windows提示界面&#xff1a;ModernFlyouts彻底改变你的系统体验 【免费下载链接】ModernFlyouts A modern Fluent Design replacement for the old Metro themed flyouts present in Windows. 项目地址: https://gitcode.com/gh_mirrors/mo/ModernFlyouts …...