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+iview实现分页及查询功能
Nov 17 Vue.js
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
vue使用element-ui实现表单验证
Dec 13 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
Vue详细的入门笔记
May 10 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
解决vue中provide inject的响应式监听
Apr 19 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数组操作
2011/12/30 PHP
php xhprof使用实例详解
2019/04/15 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python读取各种文件数据方法解析
2018/12/29 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
Numpy之random函数使用学习
2019/01/29 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
python 多线程中join()的作用
2020/10/29 Python
小学竞选班干部演讲稿
2014/08/20 职场文书
民主评议党员工作总结
2014/10/20 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
个人承诺书格式范文
2015/04/29 职场文书
大学开学感言
2015/08/01 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS