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 学习笔记(五)
Dec 31 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
Apr 02 Javascript
js模拟淘宝网的多级选择菜单实现方法
Aug 18 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
引用jquery框架后出错的解决方法
Aug 09 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
JS实现简单抖动效果
Jun 01 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
Sep 21 jQuery
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
vue--vuex详解
Apr 15 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
jquery 遍历hash操作示例【基于ajax交互】
Oct 12 jQuery
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
php实现ping
2006/10/09 PHP
?生?D片??C字串
2006/12/06 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
js实现延迟加载的几种方法
2017/04/24 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
Python解释执行原理分析
2014/08/22 Python
python基础教程之常用运算符
2014/08/29 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
10条PHP编程习惯
2014/05/26 面试题
法雷奥SQA(electric)面试问题
2016/01/23 面试题
白酒业务员岗位职责
2013/12/27 职场文书
团队会宣传标语
2014/10/09 职场文书
2014年学生工作总结
2014/11/20 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
公诉意见书范文
2015/06/05 职场文书
python四种出行路线规划的实现
2021/06/23 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers