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 02 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
vue监听滚动事件的方法
Dec 21 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
vue的项目如何打包上线
Apr 13 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
DOM XPATH获取img src值的query
2013/09/23 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
十八大感想感言
2014/02/10 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
部队个人年终总结
2015/03/02 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书