基于vue实现可搜索下拉框定制组件


Posted in Javascript onMarch 26, 2020

实践加深对vue的理解和运用有效途径,本文是基于vue的可搜索下拉框定制组件实现,在此记录.

一、效果

基于vue实现可搜索下拉框定制组件

二、组件代码

dropdown.vue

<template>
 <div class="vue-dropdown default-theme" v-show-extend="show">
 <div class="search-module clearfix" v-show="length">
 <input class="search-text" 
 @keyup='search($event)' :placeholder="placeholder" />
 <span class="glyphicon glyphicon-search search-icon"></span>
 </div>
 <ul class="list-module" v-show="length">
 <li v-for ="(item,index) in datalist" @click="appClick(item)" 
 :key="index">
 <span class="list-item-text">{{item.name}}</span>
 </li>
 </ul>
 <div class="tip__nodata" v-show="!datalist.length">{{nodatatext}}</div>
 </div>
</template>

<script>
 export default {
 data(){
 return {
 _datalist:this.itemlist.concat(),
 datalist:this.itemlist.concat(),
 length:this.itemlist.length
 }
 },
 props:{
 'show':{//用于外部控制组件的显示/隐藏
 type:Boolean,
 default:true
 },
 'itemlist':Array,
 'placeholder':String,
 'nodatatext':String
 },
 directives:{
 'show-extend':function(el,binding,vnode){//bind和 update钩子
 let value = binding.value,searchInput = null;
 if(value){
  el.style.display='block';
 }else{//隐藏后,恢复初始状态
  el.style.display='none';
  searchInput = el.querySelector(".search-text");
  searchInput.value = '';
  vnode.context.datalist = vnode.context.itemlist;//还原渲染数据
 }
 }
 },
 methods:{
 appClick:function(data){
 this.$emit('item-click',data);
 },
 search:function(e){
 let vm = this,searchvalue = e.currentTarget.value;
 vm.datalist = vm.$data._datalist.filter(function(item,index,arr){
  return item.name.indexOf(searchvalue) != -1;
 });
 }
 },
 mounted:function(){

 }
 }
</script>

<style lang="scss" scoped>
 .vue-dropdown.default-theme {
 position: absolute;
 left:15%;
 display: none;
 width: 70%;
 margin: 0 auto;
 margin-top: 1em;
 padding: 1em;
 z-index:10;
 box-shadow: 0px 0px 10px #ccc;
 &._self-show {
 display: block!important;
 }

 .search-module {
 position: relative;
 .search-text {
 width: 100%;
 height: 30px;
 padding-right: 2em;
 padding-left:0.5em;
 border-radius: 0.5em;
 box-shadow: none;
 border: 1px solid #ccc;

 &:focus {
  border-color: #2198f2;
 }
 }

 .search-icon {
 position: absolute;
 top: 24%;
 right: 0.5em;
 color: #aaa;
 }

 }

 .list-module {
 max-height: 200px;
 overflow-y: auto;
 li {
 &._self-hide {
  display: none;
 }
 margin-top: 0.5em;
 padding: 0.5em;
 &:hover {
  cursor:pointer;
  color: #fff;
  background: #00a0e9;

 }
 }
 }
 }
 .tip__nodata {
 font-size: 12px;
 margin-top: 1em;
 }
</style>

三、组件使用

<dropdown :itemlist="itemlist" :placeholder="placeholder" :nodatatext="nodatatext"></dropdown>

更多搜索功能实现的精彩文章,请点击专题:javascript搜索功能汇总 进行学习

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
动态控制Table的js代码
Mar 07 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
jQuery之Deferred对象详解
Sep 04 Javascript
js验证框架实现代码分享
May 18 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
JavaScript实现审核流程状态的动态显示进度条
Mar 15 Javascript
详谈js中标准for循环与foreach(for in)的区别
Nov 02 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
浅谈Vue.js组件(二)
Apr 09 Javascript
JavaScript怎样在删除前添加确认弹出框?
May 27 Javascript
echarts大屏字体自适应的方法步骤
Jul 12 Javascript
深入浅析Vue中的 computed 和 watch
Jun 06 #Javascript
详解创建自定义的Angular Schematics
Jun 06 #Javascript
vue组件实现进度条效果
Jun 06 #Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 #Javascript
vue组件实现可搜索下拉框扩展
Oct 23 #Javascript
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
You might like
php curl基本操作详解
2013/07/23 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
JS实现普通轮播图特效
2020/01/01 Javascript
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
python opencv实现证件照换底功能
2019/08/19 Python
python中有关时间日期格式转换问题
2019/12/25 Python
Python中包的用法及安装
2020/02/11 Python
python如何实现复制目录到指定目录
2020/02/13 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
房产销售经理职责
2013/12/20 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
小学教师党员承诺书
2015/04/27 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Win2008系统搭建DHCP服务器
2022/06/25 Servers