vue实现下拉框全选和输入匹配
实际项目中的一个需求:
点击文本框,弹出带有复选框的选项,然后获取选中项的数据,传给后面的一个功能。在文本框输入内容,也会动态的匹配下拉列表,并且列表带有全选功能。
朴素的效果图:
我选择了用vue实现,算是vue的一次练手吧。不会写的地方也百度了一下。
难点有两个,一个是全选。全选不光是点击全选复选框,选项跟着选中或不选中。还包括反向的选择,就是如果把所有选项选中了,那么“全选”也要跟着选中,而有任何一项未选中,那么“全选”则处于未选中状态。也就是说这是个互动的过程。只有做到这点,才是一个好的用户体验。
我是在循环数据的每一项加了一个表示选中状态的值lineCheck。全选和选项的点击分别写。点击全选中,把选项的状态置为和其一致就可以。
点击选项时,利用every方法,只有每一项为真(也就是选中),全选才为真,否则为假(未选中)。
第二个难点就是输入时的匹配问题,是在computed中写了一个searchLists,下拉列表的for循环也用的这个数据,全选时遍历的也是这个数据。
其他tips:
1)表单的操作离不开v-model
2)点击事件加上stop修饰符,阻止冒泡
3)复选框的事件用的change
4)注意用label,这样点击文字也有效果,体验更佳
5)点击页面空白处,隐藏下拉列表
总体来说,用户体验做的还是不错的。
贴出完整代码:(没有好看的样式,就是最朴素的效果,毕竟css对于前端人员来说是最最简单的)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>下拉框全选</title>
<link rel="stylesheet" href="css/this.css" />
</head>
<body>
<div class="m-select-wrap" id="v_app">
<div class="title">
<input type="text" placeholder="输入/勾选" v-model="searchLine" @click.stop="showList" @focus="inputFocus">
<span class="show-list" @click.stop="toggleList">∨</span>
<span class="select-con">选中了:{{selectCon}}</span>
</div>
<ul v-if="isShow" @click.stop="showList">
<li>
<label><input type="checkbox" v-model="checkAllState" @change="checkAll"> 全选</label>
</li>
<li v-for="item in searchLists">
<label :id="item.lineId"><input type="checkbox" v-model="item.lineCheck" @change="checkOne(item)"> {{item.lineName}}</label>
</li>
</ul>
</div> <script src="js/vue.js"></script>
<script>
var lines = [
{
lineId: 'line1',
lineName: '数据1',
lineCheck: false
},
{
lineId: 'line2',
lineName: '数据2',
lineCheck: false
},
{
lineId: 'line3',
lineName: '数据3',
lineCheck: false
},
{
lineId: 'line4',
lineName: '数据4',
lineCheck: false
},
{
lineId: 'line5',
lineName: '数据5',
lineCheck: false
}
] new Vue({
el: '#v_app',
data: {
//数据
lineList: lines,
//选项的选中状态
checkAllState: false,
//选中的数据
checkedList: [],
//文本框的值
searchLine: '',
//下拉列表是否显示
isShow:false,
//选中的内容
selectCon:''
},
methods: {
//全选
checkAll: function() {
for (var i = 0; i < this.searchLists.length; i++) {
this.searchLists[i].lineCheck = this.checkAllState;
}
this.getCheckData();
},
//选择单个
checkOne: function(item) {
this.searchLists.every(function(item) {
return item.lineCheck == true;
}) ? this.checkAllState = true : this.checkAllState = false;
this.getCheckData();
},
//获取选中的数据
getCheckData: function() {
this.checkedList = this.searchLists.filter(function(item) {
return item.lineCheck == true;
}) //选中的值显示到输入框中
this.selectCon='';
for(var i=0;i<this.checkedList.length;i++){
this.selectCon+=this.checkedList[i].lineName+',';
}
},
//切换下拉列表
toggleList:function(){
this.isShow=!this.isShow;
},
//显示下拉列表
showList:function(){
this.isShow=true;
},
//文本框获得焦点时文字被选中
inputFocus:function(e){
e.currentTarget.select();
}
},
computed: {
//输入框筛选列表
searchLists: function() {
var _search = this.searchLine;
if (_search) {
return this.lineList.filter(function(item) {
return Object.keys(item).some(function(key) {
return String(item.lineName).toLowerCase().indexOf(_search) > -1
})
})
}
return this.lineList;
}
},
mounted:function(){
var _this=this;
//点击页面空白处隐藏下拉列表
document.addEventListener('click',function(){
_this.isShow=false;
});
}
});
</script>
</body>
</html>
css:
.m-select-wrap{width: 300px;margin: 20px auto 0;}
.m-select-wrap .title{width: 300px;position: relative;}
.m-select-wrap input[type="text"]{width: 300px;height: 40px;padding: 0 5px;}
.m-select-wrap .select-con{position: absolute;left: 105%;white-space: nowrap;line-height: 40px;}
.m-select-wrap .show-list{position: absolute; width: 30px;height: 40px;line-height: 38px;border: 1px solid #aaa;right:;text-align: center;cursor: pointer;}
.m-select-wrap ul{border: 1px solid #ccc;padding:0 30px 10px 10px;}
.m-select-wrap li{margin-top: 10px;}
vue实现下拉框全选和输入匹配的更多相关文章
- jquery实现下拉框多选
一.说明 本文是利用EasyUI实现下拉框多选功能,在ComboxTree其原有的基础上对样式进行了改进,样式表已上传demo,代码如下 二.代码 <!DOCTYPE html PUBLIC & ...
- combobox中动态加入几个checkbox,实现下拉框多选
combobox中动态加入几个checkbox,实现下拉框多选,将一个checkbox选中时其内容就会在combobox中显示出来,将另一个checkbox选中时其内容会跟在第一个checkbox的内 ...
- vue获取下拉框值
vue获取下拉框的值,用vue-modle,只有点击下拉框的值才会赋值到下拉框中,初始时下拉框没有数据,而改用$event就不会出现这样的问题,下面看代码以及图解: v-model解决方式: < ...
- Excel怎么下拉框多选
打开Exlce, 确定,然后 右击查看代码,把这段代码复制到新建的文件里面 此时Excel会给出提示,选择否,,系统会提示保存,在保存的时候选择启用宏的工作簿然后保存,此时Excel下拉框多选就搞定了 ...
- vue select下拉框绑定默认值
vue select下拉框绑定默认值: 首先option要加value值,以便v-model可以获取到对应选择的值 一.当没有绑定v-model,直接给对应的option加selected属性 二.当 ...
- VUE 单选下拉框Select中动态加载 默认选中第一个
<lable>分类情况</lable> <select v-model="content.tid"> <option v-for=&quo ...
- QT实现输入框与下拉框提示并可模糊匹配
功能:支持下拉框选择.手动输入更改和模糊匹配 组件:QLineEdit.QComboBox.QCompleter.QStringListModel 一.组件介绍 1.1 QLineEdit QLine ...
- easyui combotree下拉框多选赋值
发现jquery.easyui.min.js 1.3.4版本的用setValues给多选下拉框赋值不成功,只能用1.3.1版本的 Html代码: <input id="ProductL ...
- checkboxlist 下拉框多选功能 ,模拟dropdownlist带复选框效果
前台代码 01.<html xmlns="http://www.w3.org/1999/xhtml"> 02.<head runat="server&q ...
随机推荐
- POJ2663 Tri Tiling
思路: 设a[i]为N=i时的方法数.i为奇数的时候肯定为0. 如果i为偶数,a[i]可以看成a[i-2]加上两个单位组成的,此时多出来的2单位有3种方法. 也可以看成a[i-4]加上四个单位组成的, ...
- C++ 输出到文本文件
输出到文本文件 就像从文件输入数据一样,你也可以将数据输出到文件.假设你有一个矩阵,你想把结果保存到一个文本文件中.你会看到,将矩阵输出到文件的代码和将矩阵输出到终端的代码非常相似. 你需要在本地运行 ...
- 解决大数据难题 阿里云MaxCompute获科技大奖
摘要: 据介绍,MaxCompute(大规模分布式的数据计算平台)是国内最早自研的大数据计算平台之一,主要应用于大规模数据处理场景.目前,这项源自浙江.解决世界级难题的成果已拥有EB(百京)级别的数据 ...
- Browse W3C's Open Source Software
https://www.w3.org/Status.html Browse W3C's Open Source Software Amaya - a Web browser/editor First ...
- oracle函数 ln(y)
[功能]返回以e为底的y的对数(e为数学常量) [参数]y,数字型表达式 (条件y>0) [返回]数字 [示例] select exp(3),exp(-3),ln(20.0855369),ln( ...
- Reasoning and Learing学习笔记
Assignment 1 question 1 1.clisp安装及运行->参考博客 2.参数为列表,参考PPT 3.把嵌套列表变成非嵌套->题目P07 代码
- codeforces 1214
D 比赛的时候居然看漏了条件... 若在(x, y)格子,那么只能移动到(x+1, y)或(x, y+1) 这样的话就好做了,直接dp,然后统计每一种路径长度经过的点数. #include<cs ...
- js常见错误类型及chrome常见报错(更新中)
ECMA-262 定义了下列 7 种错误类型: 1.Error 错误 2.EvalError 全局错误 eval函数没有正确执行 3.RangeError 范围错误 4.ReferenceError ...
- uva 562 Dividing coins(01背包)
Dividing coins It's commonly known that the Dutch have invented copper-wire. Two Dutch men were f ...
- HDU 1236
水题~~但我做了很久: 题意:是中国人都懂了 思路:结构体排序: 以后要多用用重定义的排序手段,!!!!!多用!!多用!!多用!! #include<iostream> #include& ...