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

下拉选择输入框(基于elment-ui)

最近在需求中,需要有一个下拉选择功能,又得可以输入,在 element-ui 官网找了,发现没有适合的,然后在修炼 cv 大法的我,也在网上看了一下,但是也都感觉不合适,所以就自己写了两个,供大家参考一下

下拉选择输入框子组件1 代码:

<template><div class="container"><el-popover v-model="visible"trigger="click"popper-class="select-input"placement="bottom"width="400"><div><div class="item"v-for="(item,index) in selectArr":key="index"@click="chooseItem(item)">{{ item[selectObj.label] }}</div></div><el-input slot="reference"v-model="input"placeholder="请输入内容"@input="inputChange"></el-input></el-popover></div>
</template>
<script>
export default {name: 'select-input-popover',props: {inputValue: {  // 父组件需要改变的数据type: String,default: ''},selectArr: {  // 下拉的选项type: Array,default: () => []},selectObj: {type: Object,default: () => ({value: 'value',   // 选中的时候赋的值label: 'label'     // 用于显示的名称})}},watch: {input (val) {const obj = this.selectArr?.find((el) => {return el[this.selectObj.label] == val})if (obj) {       // 判断 input 的名称是否是下拉选择框里面的名称,如果是,把下拉选择框里面的值赋给父组件this.$emit('update:inputValue', obj[this.selectObj.value])return}this.$emit('update:inputValue', val)   // 如果 input 的名称不是下拉选择框里面的名称,把 input 的值赋给父组件}},data () {return {visible: false,input: ''};},methods: {chooseItem (item) {this.input = item[this.selectObj.label]this.visible = falsethis.$emit('update:inputValue', item[this.selectObj.value])},inputChange () {this.visible = false}}
};
</script><style lang="scss" scoped>
.container {position: absolute;left: 200px;top: 200px;margin: 0;max-width: 500px;
}
.item {cursor: pointer;padding: 0 20px;height: 34px;line-height: 34px;&:hover {background: #f5f7fa;}
}
</style>
<style>
.select-input {padding: 6px 0 !important;
}
</style>

下拉选择输入框子组件2 代码:

<template><div class="container"><el-dropdown @visible-change="test"trigger="click"@command="handleCommand"><span class="el-dropdown-link"><el-input class="item"v-model="input"placeholder="请输入内容"></el-input></span><el-dropdown-menu slot="dropdown"><el-dropdown-item v-for="(item,index) in selectArr":key="index":command="item">{{ item[selectObj.label] }}</el-dropdown-item></el-dropdown-menu></el-dropdown></div>
</template><script>
export default {name: 'select-input',props: {inputValue: {  // 父组件需要改变的数据type: String,default: ''},selectArr: {  // 下拉的选项type: Array,default: () => []},selectObj: {type: Object,default: () => ({value: 'value',   // 选中的时候赋的值label: 'label'     // 用于显示的名称})}},watch: {input (val) {const obj = this.selectArr?.find((el) => {return el[this.selectObj.label] == val})if (obj) {       // 判断 input 的名称是否是下拉选择框里面的名称,如果是,把下拉选择框里面的值赋给父组件this.$emit('update:inputValue', obj[this.selectObj.value])return}this.$emit('update:inputValue', val)   // 如果 input 的名称不是下拉选择框里面的名称,把 input 的值赋给父组件}},data () {return {input: ''}},updated () {console.log(123);},methods: {test () {console.log(789);},handleCommand (val) {  // 处理选项//   console.log(val, 'val');//   console.log(this.selectObj.value, 'selectObj');this.input = val[this.selectObj.label]}}
}</script><style scoped>
.container {position: absolute;left: 200px;top: 200px;margin: 0;max-width: 500px;
}
.el-dropdown-menu {top: 35px;width: 100%;
}
</style>

父组件代码

<template><div id="app"><ownSelect1 :inputValue.sync="value":selectArr="options":selectObj="selectObj"></ownSelect1></div>
</template><script>
import ownSelect1 from "./components/ownSelect1.vue"export default {name: 'App',components: {ownSelect1},data () {return {options: [{itemValue: '选项1',itemLabel: '黄金糕'}, {itemValue: '选项2',itemLabel: '双皮奶'}, {itemValue: '选项3',itemLabel: '蚵仔煎'}, {itemValue: '选项4',itemLabel: '龙须面'}, {itemValue: '选项5',itemLabel: '北京烤鸭'}],  // 下拉的选项selectObj: {value: 'itemValue',   // 选中的时候赋的值label: 'itemLabel'    // 用于显示的名称},value: '',  // 输入框或者下拉框 赋的值}}
}
</script><style>
#app {display: flex;justify-content: center;/* align-items: center; */height: 100vh;
}
</style>

效果:

直接输入:

选项:

以上我自己写的组件代码,可以直接粘贴到项目中使用,不过我在网上看,其中有一篇的文章的,我觉得还不错,不过后面我发现有点麻烦,我懒得去细细研究他的做法,在这里我也提一下,有兴趣的可以自己去研究一下,他说的是,把 el-input 组件 和 el-select 放在一起,然后通过定位来把 el-input 放在 el-select 下拉选择的那里,其中 el-input 和 el-select 绑定一样的值

相关文章:

  • 【JavaEE】多线程代码案例(2)
  • 8.ApplicationContext常见实现
  • 【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验15 网络故障导致的路由环路问题
  • CPU通过网络将IP camera的RTSP流(H.264编码或是H.265编码)拉回, 交给GPU解码并显示的处理流程
  • 浅聊权限系统设计模型
  • vite+vue3+nginx配置统一公共前缀
  • 尚硅谷k8s 2
  • 航空数据管控系统-②项目分析与设计:任务1:需求分析-项目场景引入
  • HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)
  • React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch
  • 手动访问mongo和ES插入和查询
  • Flutter——最详细(Drawer)使用教程
  • MySQL InnoDB Cluster 高可用集群部署
  • ​浅谈 Linux 中的 core dump 分析方法
  • 【软件测试】Postman接口测试基本操作
  • [译] 怎样写一个基础的编译器
  • 77. Combinations
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java 多线程基础, 我觉得还是有必要看看的
  • Java读取Properties文件的六种方法
  • jquery cookie
  • log4j2输出到kafka
  • Promise初体验
  • Python利用正则抓取网页内容保存到本地
  • Quartz初级教程
  • STAR法则
  • ucore操作系统实验笔记 - 重新理解中断
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零开始的无人驾驶 1
  • 给初学者:JavaScript 中数组操作注意点
  • 基于axios的vue插件,让http请求更简单
  • 马上搞懂 GeoJSON
  • 那些年我们用过的显示性能指标
  • 前端技术周刊 2019-02-11 Serverless
  • 入门到放弃node系列之Hello Word篇
  • 使用权重正则化较少模型过拟合
  • 探索 JS 中的模块化
  • 运行时添加log4j2的appender
  • 怎么把视频里的音乐提取出来
  • 栈实现走出迷宫(C++)
  • 阿里云服务器如何修改远程端口?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 如何正确理解,内页权重高于首页?
  • ###C语言程序设计-----C语言学习(3)#
  • (11)MATLAB PCA+SVM 人脸识别
  • (39)STM32——FLASH闪存
  • (42)STM32——LCD显示屏实验笔记
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (九十四)函数和二维数组
  • (十一)c52学习之旅-动态数码管
  • (四)库存超卖案例实战——优化redis分布式锁
  • (四)图像的%2线性拉伸
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法