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 相关文章推荐
js脚本学习 比较实用的基础
Sep 07 Javascript
在javascript中如何得到中英文混合字符串的长度
Jan 17 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
JS中数组重排序方法
Nov 11 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
jQuery插件之validation插件
Mar 29 jQuery
详解Chai.js断言库API中文文档
Jan 31 Javascript
React 实现拖拽功能的示例代码
Jan 06 Javascript
浅谈vue中组件绑定事件时是否加.native
Nov 09 Javascript
Vue常用的全选/反选的示例代码
Feb 19 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 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
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
MySQL修改密码方法总结
2008/03/25 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
[03:06]V社市场总监Dota2项目负责人Erik专访:希望更多中国玩家加入DOTA2
2014/07/11 DOTA
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
Pytorch之parameters的使用
2019/12/31 Python
Python3运算符常见用法分析
2020/02/14 Python
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
高一新生军训方案
2014/05/12 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
投诉信范文
2015/07/02 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python