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控制回车事件的代码
Feb 20 Javascript
简单的js表单验证函数
Oct 28 Javascript
javaScript如何处理从java后台返回的list
Apr 24 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
AngularJS入门教程之ng-class 指令用法
Aug 01 Javascript
jQuery如何封装输入框插件
Aug 19 Javascript
vue2.0开发实践总结之疑难篇
Dec 07 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
Jan 18 Javascript
node跨域请求方法小结
Aug 25 Javascript
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
微信小程序实现吸顶效果
Jan 08 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
基于mysql的论坛(5)
2006/10/09 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
javascript,php获取函数参数对象的代码
2011/02/03 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
Django的数据模型访问多对多键值的方法
2015/07/21 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Python模块的加载讲解
2019/01/15 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
企业申诉管理制度
2014/01/30 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang