Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件


Posted in Vue.js onApril 17, 2021

带下拉选项的输入框 (Textbox with Dropdown) 是既允许用户从下拉列表中选择输入又允许用户自由键入输入值。这算是比较常见的一种 UI 元素,可以为用户提供候选项节省操作时间,也可以给可能存在的少数情况提供适配的可能。

本来想着这个组件比较常见应该已经有比较多现成的例子可以直接应用,但是搜索了一圈发现很多类似的组件都具备了太多的功能,例如搜索,多选等等 (简单说:太复杂了!)。于是就想着还是自己动手写一个简单易用的,此处要感谢肥老板在我困惑时的鼎力相助。

这个 UI 元素将被用于 Common Bar Width App 中。

Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件

注册组件

通过将封装好的组件代码复制粘贴来注册全局组件。

设计的时候有考虑到输入框可能存在不同的类型,例如文本输入框,数值输入框,百分数输入框等等。所以在封装的代码中会通过函数 inputRule 来限制输入。限制的方法是利用 Regex 进行过滤。如果有其他类型,也可以通过修改 inputRule 中的过滤条件。

<script type="text/x-template" id="dropdown">
    <div class="dropdown" v-if="options">
        <!-- Dropdown Input -->
        <input  :type="type"
                :disabled="disabled"
                v-model="input_value"
                @focus="showOptions()"
                @blur="exit()"
                @keyup="keyMonitor"
                @input="input_value = inputRule(type)" />
...
</script>
<script>
    Vue.component('dropdown', {
        template: '#dropdown',
        props: {
            type: String,
            options: Array,
            disabled: Boolean,
            value: String
        },
...
        methods: {
            inputRule:function(type){
                var value;
                switch(type){
                    case 'text':
                        value = this.input_value.replace(/[^a-zA-Z0-9]/g,'');
                        break;
                    case 'number':
                        value = this.input_value.replace(/^(?![+-]?\d+(\.\d+)?$)/g,'');
                        break;
                    case 'percentage':
                        value = this.input_value.replace(/[^\d]/g,'');
                        value = value > 100 ? '100' : value;
                        value = value < 0 ? '0' : value;
                        break;
                    default:
                        console.log("no limitation");
                }
                return value;
            },
...
</script>

调用组件

添加自定义标签调用组件。

<dropdown   type = "text"
            :options = "text_options" 
            :value = "text_value"
            :disabled = "text_disabled" 
            @on_change_input_value = "onTextChange">
</dropdown>

传递数据

最后动态绑定数据到父级组件, props 中:

  • type: 输入框的类型,现支持 text, number 和 percentage。
  • options: 输入框下拉列表的选项
  • value: 输入框的值
  • disabled: 是否禁止点击输入框

另外我们还需要在父级实例中定义事情,用于更新输入框的值

on_change_input_value: 更新值

data: function () {
    return {
        text_value: 'ccc',
        text_disabled: false,
        text_options: [
            { id: 1, name: 'a' },
            { id: 2, name: 'bb' },
            { id: 3, name: 'ccc' },
            { id: 4, name: 'dddd' },
            { id: 5, name: 'eeeee' },
            { id: 6, name: 'fffff ' },
            { id: 7, name: 'gggggg' },
            { id: 8, name: 'hhhhhhh' },
            { id: 9, name: 'iiiiiiii' },
        ],
        ...
    }
},
...
methods: {
    onTextChange: function (new_text_value) {
        this.text_value = new_text_value;
    },
...
},

源代码

GitHub

到此这篇关于Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件的文章就介绍到这了,更多相关Vue.js 带下拉选项的输入框内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue中computed和watch有哪些区别
Dec 19 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
vue穿梭框实现上下移动
Jan 29 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
vue如何清除浏览器历史栈
May 25 Vue.js
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
Python smtplib实现发送邮件功能
2018/05/22 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
jupyter notebook 重装教程
2020/04/16 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
大学生村官考核材料
2014/05/23 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
2014年保密工作总结
2014/11/22 职场文书
诚实守信主题班会
2015/08/13 职场文书
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python