uni-app 实现搜索关键词高亮效果

Posted 铁锤妹妹@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uni-app 实现搜索关键词高亮效果相关的知识,希望对你有一定的参考价值。

1. 前言

根据关键字搜索相关地理位置的需求,并把关键词高亮显示,关键词输入提示用到了腾讯地图的sdk,帮助用户快速输入,详情见腾讯地图 getSuggestion,这其实是一个挺常见的需求,所以想记录一下。

想实现的效果:

2. 实现逻辑

1. 使用腾讯地图sdk 关键词输入提示,过滤出符合条件的值
2. 过滤出来的值要添加样式,达到想要的高亮效果。
3. 需要正则匹配,模糊查询展示高亮。

  • 正则表达式文档
    new RegExp(pattern, attributes) JavaScript RegExp 对象
  • replace() 方法用于在字符串中用一些字符替换另一些字符
    stringObject.replace(regexp/substr,replacement) replace() 方法

3. 封装搜索关键词方法

 // 搜索关键词
export function searchKeyword (keyword, city) 
  return new Promise((resove, reject) => 
    const qqmapsdk = new QQMapWX(
        key: 'VNBBZ-SKMRW-U5TR5-OIYQZ-VEOMF-IABLP',  //之前在腾讯位置服务申请的key
  )
    qqmapsdk.getSuggestion(
      keyword: keyword,  //搜索关键词
      region: city,  //城市名
      region_fix: 1, //固定在当前城市
      success: (res) => 
        resove(res)
      ,
      fail: (e) => 
        reject(e)
      ,
    )
  )

4. 实现代码

<template>
   <view class="select_root">
   <!-- 地址搜索 -->
    <view class="searchCon">
      <view class="cityCon" @click="getCityList">
        <text class="city u-line-1"> city </text>
        <u-icon name="arrow-down" color="#474A54" size="10"></u-icon>
      </view>

      <view class="searchInput">
        <u-search
          placeholder="请输入地址"
          v-model="keyword"
          shape="square"
          :clearabled="true"
          height="65rpx"
          bgColor="#F5F6FA"
          borderColor="#ECECEC"
          :animation="true"
          :showAction="false"
          @change="getsuggestList"
        ></u-search>
      </view>
    </view>
    <!-- 搜索地址结果 -->
       <view class="filterList" v-if="filterList.length > 0">
        <scroll-view
          scroll-y
          scroll-with-animation
          :scroll-top="scrollTop"
          :style=" height: `calc(100vh - 53px)` "
        >
          <block v-for="(item, index) in filterList" :key="index">
            <view class="item" @click="selectFilterLocation(item)">
              <rich-text :nodes="item.titleStyle" class="filterTitle"></rich-text>
              <view class="address"> item.address </view>
            </view>
          </block>
        </scroll-view>
      </view>
       <!-- 无搜索结果 -->
      <view class="filterList" v-if="filterList.length === 0 && showEmpty">
        <u-empty
          mode="search"
          text="没发现这个地址,换个关键词试试吧~"
          marginTop="100"
        />
      </view>
  </view>
</template>
<script>
import  searchKeyword  from '@/utils/tool.js'
export default 
  data() 
    return 
      city:'青岛' 
      keyword: '', //搜索关键词
      filterList: [], //搜索结果
      showEmpty: false, // 搜索空状态
    
  ,
  methods:
  // 点击搜索的任意一条
   selectFilterLocation(e) 
      //做一些存储操作或者根据项目需求自己改
      uni.setStorageSync("xxx", e)
      this.filterList = []
      this.keyword = '' 
   ,
   // input输入框发生改变
    getsuggestList(keyword) 
      if (keyword === '') 
        this.filterList = []
        this.showEmpty = false
        return
      
      //过滤符合条件的值
      searchKeyword(keyword, this.relocation.city)
        .then((res) => 
          console.log(res, '筛选数组');
          let sug = []
          res.data.forEach((item) => 
            sug.push(
              id: item.id,
              location: item.title,
              titleStyle: this.join(item.title, keyword),
              address: item.address,
              city: item.city,
              lat: item.location.lat,
              lng: item.location.lng,
            )
          )
          this.filterList = sug
          if (this.filterList.length === 0) 
            this.showEmpty = true
           else 
            this.showEmpty = false
          
        )
        .catch((err) => 
          console.log(err)
        )
    ,
    // 拼接  关键词高亮
    join(str, key) 
      var reg = new RegExp(`($key)`, 'gm')
      var replace = '<span style="color:#F3671A;font-weight:bold;">$1</span>'
      return str.replace(reg, replace)
    ,

</script>
<style lang="scss" scoped>
 .searchCon 
    display: flex;
    align-items: center;
    padding: 0 22upx;
    box-sizing: border-box;
    background: #fff;
    border-bottom: 1upx solid #eee;
    .cityCon 
      margin-right: 36upx;
      display: flex;
      align-items: baseline;
      .city 
        max-width: 155upx;
        font-size: 27upx;
        margin-right: 8upx;
      
    
    .searchInput 
      flex: 1;
      margin: 18upx auto;
    
  
 .filterList 
    position: absolute;
    top: 106upx;
    bottom: 0;
    left: 0;
    right: 0;
    background: #fff;
    padding: 0 22upx;
    .item 
      padding: 22upx 0;
      border-bottom: 1upx solid #eee;
      .filterTitle 
        font-size: 30upx;
        color: #333;
      
      .address 
        font-size: 26upx;
        color: #999;
      
    
  
</style>

打印筛选数组

5. js重点 == 处理高亮

字段高亮处理     titleStyle: this.join(item.title, keyword),
处理的函数       this.join();

6. 可参考

uni-app 搜索内容高亮(源码分享)
微信小程序根据关键字查询相关地理位置,并将搜索结果中的关键字高亮显示

以上是关于uni-app 实现搜索关键词高亮效果的主要内容,如果未能解决你的问题,请参考以下文章

编辑器是如何在搜索关键字时全文相对应的关键字高亮

IOS_SearchBar搜索栏及关键字高亮

用JS将搜索的关键字高亮显示实现代码

vue搜索实现 搜索关键字高亮

基于vue的实时搜索并高亮显示关键词

php怎么实现搜索高亮,注意是分开的字符