vue下拉菜单组件(含搜索)的实现代码


Posted in Javascript onNovember 25, 2018

之前也写过这个小组件,最近遇到select下加搜索的功能,所以稍微完善一下。

效果图:

vue下拉菜单组件(含搜索)的实现代码

子组件 dropdown.vue

<template>
 <div class="vue-dropdown default-theme">
  <div class="cur-name" @click="isShow =! isShow">{{itemlist.cur.name}}</div>
  <div class="list-and-search" :class="isShow?'on':''">
  <div class="search-module clearfix" v-show="isNeedSearch">
    <input class="search-text" 
    @keyup='search($event)' :placeholder="placeholder" />
   </div>
   <ul class="list-module">
    <li v-for ="(item,index) in datalist" @click="selectToggle(item)" 
    :key="index">
     <span class="list-item-text">{{item.name}}</span>
    </li>
   </ul>
   <div class="tip-nodata" v-show="isNeedSearch && datalist.length == 0">{{nodatatext}}</div>
  </div>
 </div>
</template>

<script>
 export default {
  data(){
   return {
    datalist:[],
    isShow:false
   }
  },
  props:{
   'itemlist':Object,//父组件传来的数据
   'placeholder':{
    type:String,
    default: '搜索' //input placeholder的默认值
   },
   'isNeedSearch':{ //是否需要搜索框
    type:Boolean,
    default: false
   },
   'nodatatext':{ //是否需要显示搜索
    type:String,
    default: '未找到结果' //没有搜索到时的文本提示
   } 
  },
  created(){
   this.datalist = this.itemlist.data;
   //点击组件以外的地方,收起
   document.addEventListener('click', (e) => {
    if (!this.$el.contains(e.target)){
     this.isShow = false; 
    }
   }, false)
  },
  methods:{
   selectToggle(data){
    this.itemlist.cur.name = data.name;
    this.isShow = false;
    this.$emit('item-click',data);
   },
   search(e){
    let searchvalue = e.currentTarget.value;
    this.datalist = this.itemlist.data.filter((item,index,arr)=>{
     return item.name.indexOf(searchvalue) != -1;
    });
   }
  }
 }
</script>

<style lang="less" scoped>
 .list-and-search{
 background: #fff;
 border: 1px solid #ccc;
 display: none;
  &.on{
   display: block;
  }
 }
 .cur-name{
 height: 32px;
 line-height: 32px;
 text-indent: 10px;
 position: relative;
 color: #777;
 &:after{
 position: absolute;
  right: 9px;
  top: 13px;
  content: " ";
  width: 0;
  height: 0;
  border-right: 6px solid transparent;
  border-top: 6px solid #7b7b7b;
  border-left: 6px solid transparent;
  border-bottom: 6px solid transparent;
 }
 &.show{
 &:after{
 right: 9px;
  top: 6px;
  border-right: 6px solid transparent;
  border-bottom: 6px solid #7b7b7b;
  border-left: 6px solid transparent;
  border-top: 6px solid transparent;
 }
 }
 }
 .vue-dropdown.default-theme {
  width: 200px;
  z-index:10;
  border-radius:3px; 
  border: 1px solid #ccc;
  cursor: pointer;
  -webkit-user-select:none; 
 user-select:none;
  &._self-show {
   display: block!important;
  }
  .search-module {
   position: relative;
   border-bottom: 1px solid #ccc;
   .search-text {
    width: 100%;
    height: 30px;
    text-indent: 10px;
    // border-radius: 0.5em;
    box-shadow: none;
    outline: none;
    border: none;
    // &:focus {
    //  border-color: #2198f2;
    // }
   }
   .search-icon {
    position: absolute;
    top: 24%;
    right: 0.5em;
    color: #aaa;
   }
  }
  input::-webkit-input-placeholder{
   font-size: 14px;
  }
  .list-module {
   max-height: 200px;
   overflow-y: auto;
   li {
    &._self-hide {
     display: none;
    }
    margin-top: 0.4em;
    padding: 0.4em;
    &:hover {
     cursor:pointer;
     color: #fff;
     background: #00a0e9;
    }
   }
  }
 }
 .tip-nodata {
  font-size: 14px;
  padding: 10px 0;
  text-indent: 10px;
 }
</style>

父组件调用

<dropdown :item-click="dropDownClick" :isNeedSearch="true" :itemlist="itemlist"></dropdown>
import Dropdown from '@/components/dropdown.vue'
export default {
 data() {
 return {
  itemlist: {
  cur: {
   val: "",
   name: "所有产品"
  },
  data: [{
   val: "",
   name: "所有产品"
  }, {
   val: 1,
   name: "梦幻西游"
  }, {
   val: 2,
   name: "梦幻无双"
  }, {
   val: 3,
   name: "大话西游"
  }]
  },
 }
 },
 components: {
 Dropdown,
 },
 methods :{
 dropDownClick(e) {
  console.log(e.name, e.val)
 }
 }
}

默认是不带搜索框,如果需要可以传这个 :isNeedSearch="true" 。

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

Javascript 相关文章推荐
JavaScript中的Array对象使用说明
Jan 17 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
Aug 23 Javascript
mac中利用NVM管理不同node版本的方法详解
Nov 08 Javascript
浅谈Vue SPA 首屏加载优化实践
Dec 15 Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 Javascript
vue.js前后端数据交互之提交数据操作详解
Apr 24 Javascript
基于vue和react的spa进行按需加载的实现方法
Sep 29 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
vue的keep-alive中使用EventBus的方法
Apr 23 Javascript
微信小程序实现左滑动删除效果
Mar 30 Javascript
vue 数据操作相关总结
Dec 17 Vue.js
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 #Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 #Javascript
详解js静态检查工具eslint配置文件
Nov 23 #Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 #Javascript
创建echart多个联动的示例代码
Nov 23 #Javascript
详解Angular模板引用变量及其作用域
Nov 23 #Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 #Javascript
You might like
用户的详细注册和判断
2006/10/09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
利用python实现周期财务统计可视化
2019/08/25 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
美国著名手表网站:Timepiece
2017/11/15 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
卫生保健工作总结2015
2015/05/18 职场文书
婚庆主持词大全
2015/06/30 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
background-position百分比原理详解
2021/05/08 HTML / CSS