Vue实现搜索结果高亮显示关键字


Posted in Javascript onMay 28, 2019

本文实例为大家分享了Vue实现搜索结果高亮显示关键字的具体代码,供大家参考,具体内容如下

1. 需要解决的问题

  • 父组件将搜索的字段传到子组件
  • 子组件接受数据,正则匹配,并替换字段

2. 具体代码

父组件代码

<template>
 <div>
 <div v-if="showMe">
 <div class="re_search">
  <svg @click="$router.go(-1)">
  <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#arrow-left.6f6409e" rel="external nofollow" ></use>
  </svg>
  <input type="search" v-model="search_text" class="v-md" placeholder="请输入商品名称" @keydown.enter="search_method">
 </div>
 <OneBusiness v-for="(item, n) in search_res" :key="n" :item="item" :search_text="search_text"></OneBusiness>
 </div>
 <!--<!– 撑开Fixednav挡住的位置 –>-->
 <div class="space"></div>
 <!-- 固定导航栏 -->
 </div>
</template>

<script>
import { mapGetters } from 'vuex';
import OneBusiness from './small_components/One_business';
import {getSearchData} from 'src/service/getData'


export default {
 name: 'search',
 data () {
 return {
  showMe: false,
  search_text: '', // 搜索框内容
  search_res: [] // 搜索结果
 };
 },
 mounted () {
 this.$store.dispatch('setLoading', true);
 // 模拟加载
 var time = Math.floor(Math.random() * 2000);
 console.log('模拟加载用时' + time);
 setTimeout(() => {
  this.$store.dispatch('setLoading', false);
  this.showMe = true;
 }, time);
 this.search_method();
 },
 computed: {
 ...mapGetters([
  'getFalseBussinessbrief' // 商家简略信息
 ])
 },
 methods: {
 async search_method () {

  var mainWord = this.$route.params.keyword;
  if (this.search_text !== '' && this.search_text !== this.$route.params.keyword) {
  mainWord = this.search_text;
  }
  this.search_text = mainWord;
  this.search_res = (await getSearchData(this.search_text)).obj.results;
  console.log(this.search_res);
 }
 },
 components: {
 OneBusiness
 }
};
</script>

<style lang="less" scoped>
.re_search{
 background:#0096ff;
 line-height:0;
 padding: .2rem;
 svg{
 width:.6rem;
 height:.6rem;
 }
 input[type="search"]{
 display:inline-block;
 height:.9rem;
 width:8rem;
 outline: none;
 border: none;
 border-radius:.45rem;
 background:#f2f2f2;
 box-sizing: border-box;
 padding: 0 .5rem;
 font-size:.4rem;
 }
}
</style>

子组件代码

<template>
 <!-- 列表单个商家 -->
 <section class="tj_business" >
 <section class="one_business clear">
  <div class="business_img">
  <img src="../../images/guozhao.png" alt="">
  </div>
  <div class="business_info">
  <section class="business_name clear">
   <router-link :to="'/business/' + item.classNum">
   <h3 class="fl ell"><span v-if="item.className">大类</span>第{{item.classNum}}类{{ item.className }}</h3>
   </router-link>
   <div class="name_icon fr">
   <div class="code_num fr">
    <svg @click="add_cart(item.id)" style=" width: .5rem; height: .5rem;">
    <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#cart-minus" rel="external nofollow" ></use>
    </svg>
   </div>
   </div>
  </section>
  <section class="business_code clear">
   <div class="code_num fl">
   <!--<svg class="v-md">-->
    <!--<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#rating-star" rel="external nofollow" ></use>-->
   <!--</svg>-->
   <span class="v-md">【{{item.parentNum}}组】{{ item.groupName }}</span>
   </div>
   <div class="code_icon fr">
   </div>
  </section>
  <section class="business_other clear">
   <div class="other_price fl">
   <span class="com_gray1" v-html="ruleTitle"></span>
   <span>/</span>
   <span class="com_gray1">{{ item.number }}</span>
   </div>
   <div class="other_dis fr">
   </div>
  </section>
  </div>
 </section>

 </section>

</template>

<script>
 import {
 addMyshopcart,
 } from 'src/service/getData'

 export default {
 name: 'one_business',
 props: {
  search_text:String,
  item:{}
 },
 data () {
  return {
  msg: '1'

  };
 },
 mounted () {

 },
 computed: {
  isLogin () {
  return this.$store.getters.getLogin;
  },
  ruleTitle() {
  let titleString = this.item.gname;
  if (!titleString) {
   return '';
  }
  if (this.search_text && this.search_text.length > 0) {
   // 匹配关键字正则
   let replaceReg = new RegExp(this.search_text, 'g');
   // 高亮替换v-html值
   let replaceString = '<span class="search-text">' + this.search_text + '</span>';
   // 开始替换
   titleString = titleString.replace(replaceReg, replaceString);
  }
  return titleString;
  }
 },
 methods: {
  async add_cart(id){
  if (!this.isLogin) {
   this.$router.replace('/login');
  } else {
   var userId = this.$store.getters.getuname;
   var result = await addMyshopcart(id, userId)
   console.log(result.resMsg)

   if (result.res === 1) {
   this.$router.replace('/ShopCart/' + userId);
   } else {
   alert(result.resMsg)
   }
  }
  }
 }

 };
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="less">
 @baseBlue: #0096ff;
 @com_gray1: #666;
 @com_gray2: #999;
.search-text{
 color: #52250a;
 background: #ffd930;
 font-size: .2rem;
 padding: .02rem;
 border-radius: 2px;
 vertical-align: top;
 margin-right: .04rem;
}


 .com_gray1 {
 color: @com_gray1;
 }

 .com_gray2 {
 color: @com_gray2;
 }

 .com_blue {
 color: @baseBlue;
 }

 /* 单个商家 */
 .one_business {
 background: #fff;

 .business_img {
  width: 1.6rem;
  height: 1.6rem;
  padding: 0.4rem;
  float: left;
  img {
  width: 100%;
  height: 100%;
  }
 }
 .business_info {
  float: right;
  width: 7.4rem;
  height: 1.6rem;
  padding: 0.4rem .2rem .4rem 0;
  .business_name {
  font-size: .35rem;
  line-height: .45rem;
  vertical-align: top;
  h3 {
   width: 5rem;
   display: inline-block;
   /*span {*/
   /*color: #52250a;*/
   /*background: #ffd930;*/
   /*font-size: .2rem;*/
   /*padding: .02rem;*/
   /*border-radius: 2px;*/
   /*vertical-align: top;*/
   /*margin-right: .04rem;*/
   /*}*/
  }
  .bzp {
   width: .3rem;
   height: .3rem;
   font-size: .26rem;
   text-align: center;
   line-height: .3rem;
   display: inline-block;
   color: @com_gray2;
   border: 0.01rem solid #ddd;
   padding: 0.01rem;
   border-radius: 3px;
   i {
   font-style: normal;
   }

  }
  }
  .business_code, .business_other {
  font-size: .25rem;
  margin-top: .3rem;
  line-height: .25rem;
  }

 }
 .code_num {
  svg {
  width: .3rem;
  height: .3rem;
  fill: #ffaa0c;
  }
 }
 .zsd {
  font-size: .25rem;
  height: .35rem;
  line-height: .3rem;
  padding: 0 0.05rem;
  display: inline-block;
  color: @baseBlue;
  background: #fff;
  border: 0.01rem solid @baseBlue;
  box-sizing: border-box;
  border-radius: 3px;
 }
 .fnzs {
  font-size: .25rem;
  height: .35rem;
  padding: 0 0.05rem;
  line-height: .3rem;
  display: inline-block;
  background: @baseBlue;
  color: #fff;
  border: 0.01rem solid @baseBlue;
  box-sizing: border-box;
  border-radius: 3px;
 }
 }
</style>

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

Javascript 相关文章推荐
jquery 图片上传按比例预览插件集合
May 28 Javascript
js中eval详解
Mar 30 Javascript
jQuery-Tools-overlay 使用介绍
Jul 14 Javascript
jQuery ui插件的使用方法代码实例
May 08 Javascript
JQuery中使用ajax传输超大数据的解决方法
Jul 14 Javascript
JavaScript实现的一个计算数字步数的算法分享
Dec 06 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
May 31 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
jQuery拖拽通过八个点改变div大小
Nov 29 Javascript
js实现方块上下左右移动效果
Aug 17 Javascript
vue 设置 input 为不可以编辑的实现方法
Sep 19 Javascript
Vue2.x通用编辑组件的封装及应用详解
May 28 #Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 #jQuery
小程序多图列表实现性能优化的方法步骤
May 28 #Javascript
实例详解带参数的 npm script
May 28 #Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 #jQuery
Vue2.x通用条件搜索组件的封装及应用详解
May 28 #Javascript
jquery操作select常见方法大全【7种情况】
May 28 #jQuery
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
PHP把小数转成整数3种方法
2014/06/30 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
JS定时器实例
2013/04/17 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
js style动态设置table高度
2014/10/21 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python subprocess模块常见用法分析
2018/06/12 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
创意广告词
2014/03/17 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
退货证明模板
2015/06/23 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
Android studio 简单计算器的编写
2022/05/20 Java/Android
spring boot实现文件上传
2022/08/14 Java/Android