vue replace()实现关键词高亮(多组关键词)全局匹配不区分大小写

本文探讨了在Vue组件中,如何通过在循环体内部更新数据str以实现关键词高亮。关键在于理解为何不写'let str = this.str'会导致仅匹配最后一个关键词。通过使用`let`重新赋值,确保每次循环都能正确替换字符串中的每个匹配项。
摘要由CSDN通过智能技术生成
直接上代码
<template>
  <div>
    <span v-html="str">  </span>
  </div>
</template>
<script>
export default {
  name: "APP",
  data() {
    return {
      strKeyWord: ["complete", "successful", "error", "failed"],
      str: "complete Comlete successful Successful error Error Failed failed",
    };
  },
  methods: {
    replaceArr(strKeyWord) {
      //关键词高亮方法
      for (var i = 0; i < strKeyWord.length; i++) {
        let str = this.str; //确保每一次循环都把被替换的str赋予到值中
        var oRegExp = new RegExp("(" + strKeyWord[i] + ")", "gi");
        this.str = str.replace(
          oRegExp,
          `<span style='color: red;'>$1</span>`
        );
      }
    },
  },
  created() {
    this.replaceArr(this.strKeyWord);
  },
};
</script>
<style lang="scss" scoped>
</style>
这里有非常关键的一个地方
let str = this.str; //确保每一次循环都把被替换的str赋予到值中
我们来看一下不写这段代码的结果

在这里插入图片描述

不写会造成只匹配到最后一个关键词高亮,那么是什么原因造成的呢?我们用debugger和console.log()来查询原因。

我们可以看到,每一个关键词都执行了替换,但是只取了最后一次替换结果。

问题的原因就显而易见了,for循环执行了四次替换,而前三次替换的值并没有赋予到data中。是因为for循环的时候拿到的是初始的str,所以我们只要在循环体中加入let str = this.str;就可以在每一次循环的过程中不停的刷新str的值,最后得到的结果就是所有高亮匹配的结果。
顺便提一下“g”是全局匹配“i”是不区分大小写
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值