vue组件实现可搜索下拉框扩展


Posted in Javascript onOctober 23, 2020

本文实例为大家分享了vue组件实现可搜索下拉框的具体代码,供大家参考,具体内容如下

一、效果

vue组件实现可搜索下拉框扩展

二、代码

dropdown-ext.vue

<template>
  <div class="vue-dropdown-ext" :class="themestyle" v-show-extend="show">
    <div class="search-module clearfix" v-show="itemlist.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" :style="{maxHeight:maxH+'px'}">
      <li v-for ="(item,index) in datalist" @click="appClick(item,$event)" 
      :key="index" :title="item.name">
        <span v-if="addIcon" :class="iconClass"></span>
        :style="itemTextStyle">{{item.name}}</span>
        <span v-if="statusIconType == 'text' && hasStatus" 
        :class="item.statusClass">{{item.statusText}}</span>
         :class="item.statusClass"></span>
      </li>
    </ul>
    <div class="tip__nodata" v-show="!length&&itemlist.length">
    {{nodatatext}}
    </div>
  </div>
</template>

<script>
  export default {
    data(){
      return {
        datalist:[]
      }
    },
    props:{
      'show':{//用于外部控制组件的显示/隐藏
        type:Boolean,
        default:true
      },
      'itemlist':Array,
      'placeholder':String,
      'nodatatext':String,
      'themestyle':{
        type:String,
        default:'default-theme'
      },
      'item-text-style':{
        type:Object,
        default:function(){
          return {
            width:'80%'
          }
        }
      },
      'add-icon':{
        type:Boolean,
        default:true
      },
      'icon-class':{
        type:String,
        default:''
      },
      'has-status':{
        type:Boolean,
        default:false
      },
      'status-icon-type':{
        type:String,
        default:'text'//text or icon
      },
      'max-h':{
        type:Number,
        default:$(window).height()-400
      }
    },
    watch:{
      itemlist:function(val){
        this.datalist = val.concat();
      }
    },
    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,event){
        this.$emit('item-click',data,event);
      },
      search:function(e){
        let vm = this,searchvalue = e.currentTarget.value;
        vm.datalist = vm.itemlist.filter(
        function(item,index,arr){
          return item.name.indexOf(searchvalue) != -1;
        });
      },
      statusIconClass:function(status){
        let statusClass = '';
        return statusClass;
      }
    },
    computed:{
      length:function(){
        return this.datalist.length;
      }
    }
  }
</script>

<style lang="scss" scoped>
  .text-overflow__style {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  .vue-dropdown-ext {

    .search-module { position: relative;
      .search-text { width: 100%;
        height: 30px;
        padding-right: 2em;
        padding-left:0.5em;
        box-shadow: none;
        border: 1px solid #ccc;
        background: #fff;
        &:focus { border-color: #2198f2;
        }
      }

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

    }

    .list-module {
      overflow: auto;
      li { position: relative;
        margin-top: 0.5em;
        padding: 0.5em;
        border: 1px solid #ccc;
        white-space: nowrap;

        &>span { display: inline-block;
          vertical-align: middle;
        }

      }
    }

    .tip__nodata {
      font-size: 12px;
      margin-top: 1em;
    }

    &.default-theme {
      .list-module li { &:hover { cursor: pointer;
          border-color: #00a0e9;
        }

        &.active {
          border-color: #00a0e9;
          color: #00a0e9;
        }
      }

    }
  }
</style>

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

Javascript 相关文章推荐
[对联广告] JS脚本类
Aug 27 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
JQuery教学之性能优化
May 14 Javascript
js 动态修改css文件的方法
Aug 05 Javascript
jQuery的图片滑块焦点图插件整理推荐
Dec 07 Javascript
Node.js 学习笔记之简介、安装及配置
Mar 03 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 Javascript
Vue 动态组件与 v-once 指令的实现
Feb 12 Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 Javascript
vue 地图可视化 maptalks 篇实例代码详解
May 21 Javascript
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
Vue强制组件重新渲染的方法讨论
Feb 03 Javascript
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
vue element项目引入icon图标的方法
Jun 06 #Javascript
vue脚手架搭建过程图解
Jun 06 #Javascript
vue左右侧联动滚动的实现代码
Jun 06 #Javascript
Express本地测试HTTPS的示例代码
Jun 06 #Javascript
微信小程序仿美团城市选择
Jun 06 #Javascript
You might like
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
pyramid配置session的方法教程
2013/11/27 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
python 下划线的不同用法
2020/10/24 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
校园环保标语
2014/06/13 职场文书
小学教师岗位职责
2015/04/02 职场文书
建党伟业观后感
2015/06/01 职场文书
迎新生欢迎词2015
2015/07/16 职场文书