vue封装组件(一)标签和下拉框组合实现添加数据

背景: 最近接入短剧内容,需要添加短剧合作方。在详情页需要支持添加组件 方案一:标签tag加上输入框实现添加数据。图片见下 这个是刚开始做的,后来产品觉得这样会造成随意修改数据,需要改成下拉框形式添加 方案二:标签tag加上下拉框以及添加按钮实现。 这个就避免了乱添加数据,添加合作方名字需要在一个管理页面添加,然后下拉框请求自然就请求到数据了

方案一效果图:第一行 流程:点击新增后,填入数据,后台会自动检查是否存在,存在返回数据,否则保存然后返回数据。 这样做有个问题,一不小心填错数据,后台也保存下来了 方案二效果图:第二行 流程:下拉框中是已经存在的数据,然后选择添加就行。合作方需要在另外的一个管理页面增删查改。

接下来是代码实现。 注意:这两个都是封装的组件,直接掉用即可,既然是封装的组件,那么就要支持已经存在的合作方数据填入。

方案一

<template><div>
<!--   {{shortPlays}}--><el-tag style="margin-right: 5px" v-for="(tag,index) in shortPlaysFilter":key="index" closable@close="close(index,tag.shortPlayName)">{{tag.shortPlayName}}</el-tag><el-inputv-if="inputVisible"v-model="inputValue"ref="ref"class="input-new-tag"size="small"style="width: 100px"@keyup.enter.native="inputConfirm"@blur="inputConfirm"></el-input><el-button v-else size="small" style="margin-left: 5px;" @click="btnClick">新增合作方</el-button></div></template><script>
import * as mapRequest from "@/api/map";export default {name: "ag_album_short_play_partner",props:{//这里外部的数据传入shortPlays:{required:true,default:()=>{return [];}}},data() {return {inputVisible:false,inputValue:'',}},created() {},methods: {close(index,name){// 注意:这里的index 不能直接拿到删除 因为这个index 是过滤后的 所以通过name找下标 然后删除console.log("name",name);let findex=this.shortPlays.findIndex(f=>f.shortPlayName==name);console.log("findex",findex);if(findex==-1 || findex<0){this.$message.error("删除短剧合作方失败!请联系开发人员");return;}//console.log(findex);let data=this.shortPlays[findex];console.log("data",data);if(data.id){// 存在id 说明本身就有合作方 标记删除this.$set(data,'delFlag',true);this.$emit('input',this.shortPlays);}else{this.shortPlays.splice(findex,1);this.$emit('input',this.shortPlays);}},btnClick(){this.inputVisible=true;this.$nextTick(()=>{this.$refs.ref.$refs.input.focus();})},inputConfirm(){let inputValue=this.inputValue;if(inputValue){mapRequest.addShortPlay({name:inputValue}).then(res=>{let data=res.data.data;this.shortPlays.push({addFlag:true,shortPlayId:data.id,shortPlayName:data.name});this.$emit('input',this.shortPlays);}).catch(err=>{this.$message.error("添加短剧合作方失败");console.log(err);})}this.inputVisible=false;this.inputValue='';}},computed: {shortPlaysFilter(){let obj=this.shortPlays.filter(item=>{if(item.delFlag&&item.delFlag==true) return false;return true;});return obj;}},watch: {},components: {},}
</script><style scoped></style>

这个就是封装的组件,然后想用的时候直接引用即可。

方案二

<!--
删除逻辑:
1、原始tags中有delFlag true 这种数据不能展示,所以用 filteredTags 过滤
2、如果是本来存在的删除时可以标记delFlag true,如果时添加后(没点击提交动作,数据就没保存)又删除,这种直接删除即可 因为数据库没保存这些数据[ { "addFlag": true, "shortPlayId": 8, "shortPlayName": "北京攸合" } ]
-->
<template><div>
<!--    {{tags}}--><el-tag v-for="(tag,index) in filteredTags" :key="index" closable @close="handleClose(index)">{{tag.shortPlayName}}</el-tag><el-select v-model="bindModel" filterable clearable value-key="id"  placeholder="请选择短剧合作方" size="small" style="margin-left: 5px;width: 150px"><el-option v-for="item in options" :key="item.id" :label="item.name" :value="item"></el-option></el-select><el-button type="primary" size="small" style="margin-left: 5px" @click="addClick">添加</el-button></div>
</template><script>
import * as mapRequest from "@/api/map";
export default {name: "ag-album-short-play-partner-v2",props:{tags:{type:Array,required:true,default:()=>{return [];}}},data() {return {bindModel:{},options:[],}},created() {this.getList();},methods: {getList(){this.options=JSON.parse('[{"id":8,"name":"北京攸合","createdAt":"2023-12-26 14:26:09","updatedAt":"2023-12-26 14:26:09"},{"id":9,"name":"网易","createdAt":"2024-01-03 10:13:37","updatedAt":"2024-01-03 10:13:37"}]');//这里是要请求后台数据的// mapRequest.findShortPlayList({},{}).then(res=>{//   this.options=res.data.data.records;// }).catch(err=>{//   this.$message.error(err.data.message);// })},handleClose(index){const tag=this.filteredTags[index];// console.log("-----",tag);if(tag==null){this.$message.error("删除错误!");return;}const originalIndex = this.tags.findIndex(t => t === tag);if (originalIndex !== -1 && this.tags[originalIndex].id ) {this.$set(this.tags[originalIndex], 'delFlag', true);this.$emit('input', this.tags);}else if (originalIndex !=-1 && (this.tags[originalIndex].id === null || this.tags[originalIndex].id === undefined)  ){this.tags.splice(originalIndex,1);}// this.$set(tag,'delFlag',true);// console.log("data",tag,",tags:",this.tags);// this.$emit('input',this.tags);},addClick(){// 请勿重复添加if(this.bindModel.id){// console.log("@@@",this.bindModel);let data=this.bindModel;this.tags.push({addFlag:true,shortPlayId:data.id,shortPlayName:data.name});// console.log("---",this.tags);this.$emit('input',this.tags);this.bindModel=null;return;}else{this.$message.warning("请选择合作方后再添加~");return;}},},computed: {filteredTags() {return this.tags.filter(tag => !tag.delFlag);}},watch: {},components: {},}
</script><style scoped></style>

最终就是外面的调用

<!--
用来写测试案例
-->
<template><div><ag-album-short-play-partner :short-plays="shortPlays"></ag-album-short-play-partner><ag-album-short-play-partner-v2 :tags="shortPlays"></ag-album-short-play-partner-v2></div></template><script>
import agAlbumShortPlayPartner from "@/views/longVideo/album/components/ag_album_short_play_partner";
import AgAlbumShortPlayPartnerV2 from "@/views/longVideo/album/components/ag_album_short_play_partner_v2";
export default {name:'videoDirUploadList',data(){return{data:{album:{}},shortPlays:[{"id":8,"albumId":44116442,"shortPlayId":9,"createdAt":"2024-01-04 15:50:59","updatedAt":"2024-01-04 15:50:59","shortPlayName":"网易","delFlag":"","addFlag":""}],}},created() {},methods:{},components:{AgAlbumShortPlayPartnerV2,agAlbumShortPlayPartner,}}
</script><style>
</style>

ok,本期结束,关注作者不迷路~持续更新好用的组件~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/324447.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot配置http-Only

项目框架 jdk1.8、springboot2.5.10 情况一 项目中未使用&#xff08;权限认证框架&#xff1a;Sa-Token&#xff09; application.yml文件内增加配置 server.servlet.session.cookie.http-onlytrueserver.servlet.session.cookie.securetrue (此条配置建议也加上) 情况二…

宝强前经纪人宋喆出狱后首露面;美团外卖平台KeeTa;电视开机率跌至30%;朝军发射200多枚炮弹

今日精选 • Gartner 预测&#xff1a;到 2026 年全球 80% 的公司将在其业务中使用生成式 AI• 美团旗下外卖平台KeeTa在全港已有约31%市场占有率• 我国电视开机率跌至30%• 朝军发射200多枚炮弹 韩国发布避难令• 王宝强前经纪人宋喆出狱后首露面• 去年我国彩票销量超5796亿…

C++初级(三)

我们这里还是在C基础上进行对C基础语法的补充学习&#xff01; 一.C数组 C数组大体和C相同&#xff0c;但是C数组还是有一定的区别的。 我们先看看C和C数组共同的易错点知识&#xff1a; 1.数组只能一次初始化。 2.如果对数组只进行一部分初始化&#xff0c;那么其他未初始…

202402读书笔记|《当你老了》——灰蒙曙光比爱情温柔,清晨露珠比希望更可爱

202402读书笔记|《当你老了》——灰蒙曙光比爱情温柔&#xff0c;清晨露珠比希望更可爱 《当你老了》作者叶芝&#xff0c;断断续续碎片时间读完的一本书&#xff0c;不是很惊艳&#xff0c;但值得一读。就因为很喜欢当你老了&#xff0c;所以拾起的这本书。读完知道了原来叶芝…

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面&#xff08;GUI&#xff09;框架。它是Java平台的一部分&#xff0c;从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能&#xff0c;使开发人员能够创建具有吸引力和交互性的应用程…

NLP电影情绪分析项目

https://machinelearningmastery.com/develop-word-embedding-model-predicting-movie-review-sentiment/ https://machinelearningmastery.com/prepare-movie-review-data-sentiment-analysis/ 本教程分为 5 个部分;他们是&#xff1a; 电影评论数据集数据准备训练嵌入层训练…

火力发电厂电高压系统电弧光保护监测设备

摘要&#xff1a;介绍了电弧光保护装置的组成,对火力发电厂高压厂用电系统保护的现状及存在的不足进行了分析,以一个典型的2300MW火力发电厂工程为例,讨论了高压厂用电系统电弧光保护装置的设计应用方案,对电弧光保护装置的应用前景进行了展望。1联5系8电2话171微3信5同2号2 关…

PCIe 6.0生态业内进展分析总结-2

3.PCIe 6.0协议分析仪 (1)Keysight Keysight是德科技在2023年6月份对外宣布&#xff0c;第一款支持PCIe 6.0协议验证调试工具。 Keysight PCIe 6.0架构解决方案具备以下特点&#xff1a; 分析PCIe 6.0技术设计的数据链路/事务层 支持所有PCIe技术速率——从2.5 GT/s至64 GT/…

每日一道算法题day-three(备战蓝桥杯)

哈喽大家好&#xff0c;今天来给大家带来每日一道算法题系列第三天&#xff0c;让我们来看看今天的题目&#xff0c;一起备战蓝桥杯 题目&#xff1a; 小 Y的桌子上放着 n 个苹果从左到右排成一列&#xff0c;编号为从 11 到 n。 小苞是小 Y 的好朋友&#xff0c;每天她都会…

Idea live template

1:打印入参日志的配置 log.info("$methodName$ 方法入参: $argsLog$",$argsJson$); methodName:methodName() argsLog:groovyScript( "def result; def params\"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toList(); for(i 0; i <…

StreamPark + PiflowX 打造新一代大数据计算处理平台

&#x1f680; 什么是PiflowX PiFlow 是一个基于分布式计算框架 Spark 开发的大数据流水线系统。该系统将数据的采集、清洗、计算、存储等各个环节封装成组件&#xff0c;以所见即所得方式进行流水线配置。简单易用&#xff0c;功能强大。它具有如下特性&#xff1a; 简单易用…

x-cmd pkg | procs - ps 命令的现代化替代品

目录 简介首次用户功能特点类似工具进一步阅读 简介 procs 是用 Rust 编写的 ps 替代品&#xff0c;用于显示有关任务进程的信息 首次用户 使用 x procs 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x 命令安装, 详情参考 x-cmd…