vue2.0多条件搜索组件使用详解

本文为大家分享了vue2.0多条件搜索组件的实现方法,供大家参考,具体内容如下

搜索条件为死数据,通过select下拉,选取多个条件;同时可点击加号增加搜索条件,点击减号减少搜索条件;

templete

<template>
 <div class="retrievalmian">
 <div class="retrievaltitle">
 <a class="btn-default tabbtn" @click="seniorsearch('')" :class="[tabbtn==''?'checked':'']" >高级搜索</a>
 <a class="btn-default tabbtn" @click="seniorsearch('author')" :class="[tabbtn=='author'?'checked':'']" >作者搜索</a>
 </div>
 <div class="retrievalbar">
 <div class="formbody">
 <div class="formoperate">
  <span class="tipsicon addplus" @click="addplus" v-show="formtips.length<12"></span>
  <span class="tipsicon removeminus" @click="removeminus" v-show="formtips.length>=4"></span>
 </div>
 <div class="formline">
  <div class="formtips" v-for="(item,index) in formtips">
  <div class="formgroup">
  <select class="formcontrol" v-model="item.titletype">
  <option v-for="typeselect in titletype" v-if="tabbtn==''" :value="typeselect.value">{{typeselect.text}}</option>
  <option v-for="typeselect in titletypeAuthor" v-if="tabbtn=='author'&&!(index%2)" :value="typeselect.value">{{typeselect.text}}</option>
  <option v-for="typeselect in titletypeAuthor2" v-if="tabbtn=='author'&&(index%2)" :value="typeselect.value">{{typeselect.text}}</option>
  </select>
  </div>
  <div class="formgroup">
  <input type="text" class="forminp" v-model="item.typeinp">
  </div>
  <div class="formgroup">
  <select class="formcontrol" >
  <option v-for="accuracy in accuracys" :value="accuracy.value">{{accuracy.text}}</option>
  </select>
  </div>
  <div class="formgroup">
  <select class="formcontrol" v-model="item.containlist">
  <option v-for="containlist in containlists" :value="containlist.value">{{containlist.text}}</option> 

  </select>
  </div>
  </div>
 </div>
 <div class="formline">
  <div class="formgroup">
  <div class="catalog" @click="catalogshow" >文献分类目录</div>
  <div class="cataloghint">
  <ul class="cataloglist" v-show="iscataloglist">
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="核工业">核工业
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="航天工业">航天工业
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="航空工业">航空工业
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="船舶工业">船舶工业
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="兵器工业">兵器工业
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="军工电子">军工电子
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="国防综合">国防综合
   </label>
   </div>
  </li>
  <li>
   <div class="checkbox">
   <label>
   <input type="checkbox" v-model="cataloglist" value="其他">其他
   </label>
   </div>
  </li> 

  </ul>
  </div>
  </div>
 </div>
 <div class="formline">
  <div class="formgroup">
  <select class="formcontrollarg" v-model="timestart">
  <option v-for="startlist in timestarts" :value="startlist.value">{{startlist.text}}</option>
  </select>
  <span>——</span>
  <select class="formcontrollarg" v-model="timeend">
  <option v-for="endlist in timeends" :value="endlist.value">{{endlist.text}}</option>
  </select>
  </div>
 </div>
 <div class="formsearch">
  <button type="button" class="retrievalsearch btn btn-primary" @click="retrievalsearch">检索</button>
 </div>
 </div>
 </div>
 </div>
</template> 

script

<script>
 import $ from 'jquery'
 import conf from './../Conf'; 

 export default{
 data(){
 return {
 formtips:[ 

 ],
 tabbtn: '',//搜索切换
 cataloglist:[],//文献分类选中目录
 iscataloglist:false, 

 titletype:[
  { text: '标题', value: 'title' },
  { text: '正文', value: 'text' },
  { text: '项目', value: 'project' },
  { text: '人员', value: 'person' },
  { text: '机构', value: 'organization' },
  { text: '技术', value: 'tech' },
  { text: '地区', value: 'locaton' },
  { text: '国家', value: 'country' }
 ],
 titletypeAuthor:[{ text: '作者', value: 'author' }],
 titletypeAuthor2:[{ text: '作者机构', value: 'authoruint' }],
 accuracys: [
  {text:'精确',value:'accurate'},
  {text:'模糊',value:'blur'}
 ],
 containlists:[
  {text:'并含',value:'andwidth'},
  {text:'或含',value:'orwidth'},
  {text:'不含',value:'nowidth'},
 ], 

 timestart:'nolimit',//检索起始时间
 timeend:'2017',//检索结束时间
 timestarts:[],//开始时间选择数组
 timeends:[],//结束时间选择数组
 }
 },
 watch:{ 

 },
 created: function () {
 this.init();
 },
 methods: {
 init: function(){
 this.formtips=[
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  }
 ];
 this.timestarts = [
  {text:'不限',value:'nolimit'},
  {text:'2016',value:'2016'},
  {text:'2015',value:'2015'},
  {text:'2014',value:'2014'},
  {text:'2013',value:'2013'},
  {text:'2012',value:'2012'},
  {text:'2011',value:'2011'},
 ];
 this.timeends = [
  {text:'2017',value:'2017'},
  {text:'2016',value:'2016'},
  {text:'2015',value:'2015'},
  {text:'2014',value:'2014'},
  {text:'2013',value:'2013'},
  {text:'2012',value:'2012'},
  {text:'2011',value:'2011'},
 ]
 },
 addplus:function () {
 if(this.tabbtn==''){
  this.formtips.push({
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  });
  this.formtips.push({
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  });
 }else{
  this.formtips.push({
  titletype:'author',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  });
  this.formtips.push({
  titletype:'authoruint',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  });
 } 

 },
 removeminus:function () {
 this.formtips.splice(-2);
 },
 seniorsearch:function (str) {
 if(this.tabbtn!=str){
  this.tabbtn = str;
  if(this.tabbtn==''){
  this.formtips=[
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'title',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  }
  ];
  }else{
  this.formtips=[
  {
  titletype:'author',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'authoruint',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'author',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  },
  {
  titletype:'authoruint',
  typeinp:'',
  accuracy:'accurate',
  containlist:'andwidth',
  }
  ]
  }
 }
 }, 

 catalogshow:function () {
 this.iscataloglist = !this.iscataloglist;
 console.log(this.cataloglist);
 }, 

 retrievalsearch:function(){
 let body={
  formtips:this.formtips,
  cataloglist:this.cataloglist,
  timestart:this.timestart,
  timeend:this.timeend
 }//点击检索传的数据
 console.log(body);
 } 

 }, 

 } 

</script> 

css

<style scoped>
 /*临时样式*/
 .retrievalmian{
 margin: 20px;
 width:75%;
 }
 /**/
 /*.retrievaltitle{*/
 /*background: #FCFCFC;*/
 /*}*/
 .retrievaltitle .tabbtn:first-child{
 margin-right: -5px;
 }
 .retrievaltitle .tabbtn:hover{
 text-decoration: none;
 }
 .retrievaltitle .tabbtn{
 padding: 2px 8px;
 background: #FBFBFB;
 border: 1px solid #DFDFDF;
 margin-bottom: -1px;
 }
 .retrievaltitle .tabbtn.checked{
 color: #E50F10;
 padding-top: 8px;
 border-bottom: 1px solid #FBFBFB;
 }
 .retrievalbar{
 border: 1px solid #E5E5E5;
 background: #FCFCFC;
 }
 .formbody{
 position: relative;
 margin: 10px 0px;
 }
 .formoperate{
 position: absolute;
 top:10px;
 right: 20px;
 } 

 .formoperate .tipsicon{
 color: #59A4D2;
 display: inline-block;
 line-height: 15px;
 cursor: pointer;
 margin-left: 15px;
 width: 20px;
 height: 20px;
 }
 .formoperate .addplus{
 background: url(../static/img/addplusicon.png) no-repeat center;
 }
 .formoperate .removeminus{
 background: url(../static/img/removeicon.png) no-repeat center;
 }
 .formline{
 padding: 5px 30px;
 }
 .formtips{
 display: inline-block;
 margin-bottom: 10px;
 margin-right: 10px;
 }
 .formgroup{
 display: inline-block;
 }
 .formcontrol{
 border: 1px solid #999;
 width: 80px;
 height: 22px;
 }
 .forminp{
 border: 1px solid #146AC4;
 width: 120px;
 height: 22px;
 }
 .formcontrollarg{
 width:120px;
 height: 25px;
 }
 .formsearch{
 position: absolute;
 bottom:10px;
 right: 20px;
 }
 .retrievalsearch{
 padding: 5px 20px;
 }
 .formgroup .catalog{
 border: 1px solid #999;
 width:120px;
 height: 22px;
 cursor: pointer;
 background: url(../static/img/dropdown.png) no-repeat;
 background-position: 95% 45%;
 }
 .cataloghint{
 position: relative;
 }
 .cataloglist{
 position: absolute;
 top: -1px;
 left: 0;
 padding: 0;
 border: 1px solid #999;
 background: #fff;
 z-index: 10;
 width: 120px;
 }
 .cataloglist li{
 padding:2px 5px;
 }
 .cataloglist li:hover{
 background: #1e90ff;
 }
 .checkbox {
 margin:0px;
 }
</style> 

1、为保证点击加号出来的select标签的v-model不一样,讲v-model与v-for的item绑定;<divclass="formtips" v-for="(item,index) in formtips">
<selectclass="formcontrol" v-model="item.titletype" >

2、当点击减号使搜索条件只剩下一列时,减号消失 <spanclass="tipsicon removeminus" @click="removeminus"   v-show="formtips.length>=4" ></span>;同理给加号增加条件,通过长度判断,限制增加的检索条件最多为6列,加号消失

3、点击检索后,使选中的检索条件通过

let body={
 formtips:this.formtips,
 cataloglist:this.cataloglist,
 timestart:this.timestart,
 timeend:this.timeend
}

body传递
默认

高级搜索

作者搜索

点击减号

筛选条件三列,点击检索

控制台输出,点击检索要传的值body

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

(0)

相关推荐

  • vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据

    直接贴代码了: 先上输入前的样子: <style> #example{margin:100px auto;width:600px;} .show{margin:10px;} #searchText{display: block;margin:0 auto 10px;height:24px;line-height: 24px;width:200px;} .content ul li{text-align: center;} .content ul li span{display: inline-

  • 基于vue实现多引擎搜索及关键字提示

    本文实例为大家分享了vue实现多引擎搜索及关键字提示的具体代码,供大家参考,具体内容如下 关键代码: <div class="header-search"> <form id="form" action="http://m.baidu.com/s" method="get" accept-charset="utf-8" class="clearfix" autocomp

  • Vuejs仿网易云音乐实现听歌及搜索功能

    前言 前端时间学了vue,一开始看了vue1.0,后来实在觉得技术总得实践,就直接上手vue2.0.然后花了将近一周时间做了一个网易云音乐的小项目.一开始觉得项目比较小,没必要用vuex所以就没有使用,但是后来发现数据流传输有点麻烦,后续会使用vuex. 技术栈 vue+vue-router(核心框架) better-scroll(使移动端滑动体验更加流畅) vue-lazyload(用户图片懒加载) nprogress(用于加载过渡) axios(请求) 功能分析与设计 首先我先参考了现有的一

  • Vue 仿百度搜索功能实现代码

    无上下选择 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jsonp</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, us

  • vue.js实现含搜索的多种复选框(附源码)

    前言 最近在重构一个复选框组件,原型是select2这个jQuery插件, 有兴趣的可以去搜下,封装的很好,但是并不能满足业务所有需求,最要命的是jquery插件这种以dom驱动数据的库,并不能和vue和angular这种数据驱动dom的框架很好的结合,所以我用vue的component重构了一下,走了不少弯路,做的demo分享出来,还请大家指点一二! download地址:vue_select2(jb51.net).rar 效果图如下,封装的应该是蛮抽象的了,只需要传入下拉框选项list,默认

  • Vue.js实现多条件筛选、搜索、排序及分页的表格功能

    与上篇实践教程一样,在这篇文章中,我将继续从一种常见的功能--表格入手,展示Vue.js中的一些优雅特性.同时也将对filter功能与computed属性进行对比,说明各自的适用场景,也为vue2.0版本中即将删除的部分filter功能做准备. 需求分析 还是先从需求入手,想想实现这样一个功能需要注意什么.大致流程如何.有哪些应用场景. 表格本身是一种非常常用的组件,用于展示一些复杂的数据时表现很好. 当数据比较多时,我们需要提供一些筛选条件,让用户更快列出他们关注的数据. 除了预设的一些筛选条

  • Vue.js每天必学之组件与组件间的通信

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 使用组件 注册 之前说过,我们可以用 Vue.extend() 创建一个组件构造器: var MyComponent = Vue.extend({ // 选项... }) 要把这个构造器用作组件,需要用 `Vue.compone

  • 强大Vue.js组件浅析

    什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 如何注册组件? 需要使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件.Vue.extend方法格式如下: var MyComponent = Vue.extend({ // 选项...后面再介绍 }) 如果想要其他地方使用这个创

  • Vue2.0实现1.0的搜索过滤器功能实例代码

    Vue2.0删除了很多1.0的比较实用的过滤器,如filterBy,orderBy.官方文档给了通过计算属性实现1.0搜索过滤器功能,自己又加入了大小写通用检索功能,比较简单,学一下. <body> <div class="app"> <input type="text" v-model="name"> <ul> <li v-for="user in newUsers" &

  • 基于Vue.js实现简单搜索框

    在github上看到的练习,看个遍代码后自己再练一遍,先放原址:https://github.com/lavyun/vue-demo-search 主要用到的知识很简单,简单的vuejs2.0的知识就够了.源码用了.vue构建和ES6,用了webpack打包等等.我资历还浅,先用一个简单的.js的写. 先看效果 这里有两个组件,一个组件是logo部分的,一个是搜索框部分的. html html很简单,就是引用两个组件. <div id="app"> <logo-pic

随机推荐