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中defineProperty和Proxy的区别详解
Nov 30 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
vue+springboot实现登录验证码
May 27 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
PHP中图片等比缩放的实例
2013/03/24 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
php实现购物车功能(下)
2016/01/05 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
ASP Json Parser修正版
2009/12/06 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
详谈Node.js之操作文件系统
2017/08/29 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
基于hashlib模块--加密(详解)
2017/06/21 Python
Python之用户输入的实例
2018/06/22 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
python中数字是否为可变类型
2020/07/08 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
中国好声音广告词
2014/03/18 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
2014年科室工作总结
2014/11/20 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python