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 Pro-深入面向对象的程序设计之继承的详解
May 07 Javascript
javascript中普通函数的使用介绍
Dec 19 Javascript
javascript如何使用bind指定接收者
May 04 Javascript
node.js中使用node-schedule实现定时任务实例
Jun 03 Javascript
JavaScript修改浏览器tab标题小技巧
Jan 06 Javascript
JQuery实现动态添加删除评论的方法
May 18 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
js倒计时显示实例
Dec 11 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
Aug 24 Javascript
react-native DatePicker日期选择组件的实现代码
Sep 12 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 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语法速查表
2007/01/02 PHP
php数组编码转换示例详解
2014/03/11 PHP
php中opendir函数用法实例
2014/11/15 PHP
php自定文件保存session的方法
2014/12/10 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
初识Node.js
2015/03/20 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
python实现简单温度转换的方法
2015/03/13 Python
Python+django实现文件下载
2016/01/17 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
python时间日期操作方法实例小结
2020/02/06 Python
Python绘制组合图的示例
2020/09/18 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
《兰亭集序》教学反思
2014/02/11 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
健康家庭事迹材料
2014/05/02 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android