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生命周期的深入理解
Dec 03 Vue.js
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 Vue.js
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
PHP新手上路(五)
2006/10/09 PHP
CSS常用网站布局实例
2008/04/03 Javascript
JavaScript 动态生成方法的例子
2009/07/22 Javascript
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python对json的相关操作实例详解
2017/01/04 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Python发展简史 Python来历
2019/05/14 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python交互式图形编程的实现
2019/07/25 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
教育专业毕业生推荐信
2014/07/10 职场文书
学生检讨书范文
2015/01/27 职场文书
检讨书范文
2019/04/16 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS