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 相关文章推荐
vuex的数据渲染与修改浅析
Nov 26 Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
vue3种table表格选项个数的控制方法
Apr 14 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
基于文本的访客签到簿
2006/10/09 PHP
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
pandas的排序和排名的具体使用
2019/07/31 Python
Python读取表格类型文件代码实例
2020/02/17 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
经典c++面试题三
2015/07/08 面试题
文明礼仪小标兵事迹
2014/01/12 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
一分钟演讲稿
2014/04/30 职场文书
交通事故被告代理词
2015/05/23 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
HTML中的表单元素介绍
2022/02/28 HTML / CSS