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

本文实例为大家分享了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>

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

(0)

相关推荐

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

    本文实例为大家分享了Vue实现搜索结果高亮显示关键字的具体代码,供大家参考,具体内容如下 1. 需要解决的问题 父组件将搜索的字段传到子组件 子组件接受数据,正则匹配,并替换字段 2. 具体代码 父组件代码 <template> <div> <div v-if="showMe"> <div class="re_search"> <svg @click="$router.go(-1)">

  • php站内搜索并高亮显示关键字的实现代码

    复制代码 代码如下: <?php require_once 'sqlTools.class.php';//封装类,可执行dql.dml语句 $info=$_POST['info']; $sql="select name,password,email from user_500 where name like '%$info%' or password like '%$info%' or email like '%$info%'"; $sqlTools=new SqlTools()

  • vue中添加与删除关键字搜索功能

    具体代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible

  • Vue 实现分页与输入框关键字筛选功能

    分页的实现(Vue+Element)+输入框关键字筛选 1.这里用的是Element 自带的分页组件 <template> <div class="sales-table"> <div class="order-list-header">订单列表</div> <div class="back-box"> <div class="search-box">&l

  • vue实现搜索小功能

    本文实例为大家分享了vue实现搜索小功能的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <div id="app"> <input type="text" v-model=&qu

  • vue实现搜索关键词高亮的详细教程

    目录 正文 解析 正则api——exec reg.exec执行 接下来看看执行具体的执行结果 提取关键字并分组 完整vue代码 正文 废话少说先上效果(左侧代码,右侧效果) 第一组 第二组 第三组 看到什么规律了吗? 没错!!这份代码就是依靠正则表达式来做出高亮效果,你负责传入str与reg,而函数则负责实现代码的高亮 解析 结构部分如下 <template> <div> <span :class="index%2!==0?'hightLight':''"

  • Vue支持搜索与筛选的用户列表实现流程介绍

    目录 1. 常规风格的示例工程开发 2. 使用组合式API重构用户列表页面 3. 优化用户列表页面 1. 常规风格的示例工程开发 首先新建一个名为 normal.html 的测试文件,在HTML文件的head标签中引入Vue框架并设置常规的模板字段如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv=

  • Android 搜索结果匹配关键字且高亮显示功能

    1. 单关键字 匹配 如果只是单关键字的话,那么我们先计算出他的下标,它的长度,然后就可以标记下标到下标+长度的这一段为特殊颜色即可,代码如下: if (name != null && name.contains(keyWord)) { int index = name.indexOf(keyWord); int len = keyWord.length(); Spanned temp = Html.fromHtml(name.substring(0, index) + "<

  • jQuery过滤HTML标签并高亮显示关键字的方法

    本文实例讲述了jQuery过滤HTML标签并高亮显示关键字的方法.分享给大家供大家参考.具体如下: jQuery实现网页关键字过滤效果,将需要过滤的文字定义在JavaScript中,可定义多个,不过要修改JS代码为数组,这样可过滤出多个不同的关键字,本例只是为你演示一个基本的功能,更多过滤功能请自己挖掘吧. 运行效果如下图所示: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http:

  • Vue实现搜索 和新闻列表功能简单范例

    效果图如下所示: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>无标题页</title> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style&

随机推荐