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动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
如何管理Vue中的缓存页面
Feb 06 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue选项卡切换的实现案例
Apr 11 Vue.js
vue动态绑定style样式
Apr 20 Vue.js
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
实例讲解php数据访问
2016/05/09 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
低版本中Python除法运算小技巧
2015/04/05 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python生成式的send()方法(详解)
2017/05/08 Python
Python 判断奇数偶数的方法
2018/12/20 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
计算机专业自荐信范文
2015/03/26 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python