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 相关文章推荐
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
Oct 24 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
在JavaScript中对HTML进行反转义详解
May 18 Javascript
JavaScript实现简单的日历效果
Sep 25 Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 Javascript
Vue如何获取数据列表展示
Dec 11 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
Nov 02 Javascript
html中创建并调用vue组件的几种方法汇总
Nov 17 Javascript
javascript代码实现简易计算器
Jan 25 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
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
js随机生成一个验证码
2017/06/01 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Python中多线程及程序锁浅析
2015/01/21 Python
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
办公室经理岗位职责
2014/01/01 职场文书
大学生如何写自荐信
2014/01/08 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
个人工作表现评语
2014/04/30 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
家属答谢词
2015/01/05 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android