【问题标题】:Vue js text highlight filterVue js 文本高亮过滤器
【发布时间】:2016-06-15 15:24:45
【问题描述】:

我需要使用 vuejs 编写文本高亮过滤器的帮助。这个想法是遍历给定的单词数组,如果有匹配项,则将带有类的 span 应用于该单词。我遇到的问题是,我似乎无法使用 vuejs 以 html 格式返回数据。任何想法都将受到高度赞赏。我真的被这个困住了。

Vue.filter('highlight', function(words, query){
    //loop through **words** and if there is a match in **query**
   //apply a <span> with some style
   //At the end return formatted string to html page
})

【问题讨论】:

标签: javascript text formatting vue.js


【解决方案1】:

HTML 插值 {{{ foo }}} 已被移除以支持 vuejs2.X 中的 v-html 指令,因此从版本 2.x 开始,Vue.js 允许原始 JavaScript 模板(React 风格)除了 HTML 模板。
@jeff 的答案是正确的,但对于 vuejs 1.x 版本,但如果 {{{}}} 对你们不起作用,或者如果您想评估 HTML 中的标签,并且来自受信任的来源,例如,如果你想添加一个&lt;strong&gt;&lt;/strong&gt;标签,那么你需要使用v-html,v-html要求Vue将字符串评估为HTML:

<span v-html="$options.filters.highlight(item, val)">{{ item }}</span>

高亮过滤器:

Vue.filter('highlight', function(word, query){
  var check = new RegExp(query, "ig");
  return word.toString().replace(check, function(matchedText,a,b){
      return ('<strong>' + matchedText + '</strong>');
  });
});

或者你可以使用@Thomas Ferro 的过滤器

【讨论】:

  • 一个稍微不同的版本,让您可以使用多个查询(逗号分隔):/** * * @param { String } words * @param { String } query */ export const highlight = (words, query) =&gt; { var check = new RegExp(query.split(",").join("|"), "ig"); return words.toString().replace( check, (matchedText, a, b) =&gt; { return `&lt;strong&gt;${matchedText}&lt;/strong&gt;` } ) }
  • 很好的样品,谢谢我用了这个。如果您可以在使用 v-html 时添加潜在安全风险的警告,那就太好了
【解决方案2】:

正如 Jeff 刚才所说,基本的小胡子将数据解释为纯文本。

您可以通过将查询替换为String.replace() 方法来添加您的跨度。

这是一个基本示例:https://jsfiddle.net/0jew7LLz/

Vue.filter('highlight', function(words, query) {
    return words.replace(query, '<span class="highlight">' + query + '</span>')
});

【讨论】:

  • 如果字词没有经过净化处理,使用这种方法是有风险的。
  • 我调用vue版本2可以吗?
  • 我不知道您是否可以像示例中那样声明全局过滤器,但范围过滤器仍然可用:vuejs.org/v2/guide/filters.html
  • string.replace 将只替换一个段。可能需要正则表达式来突出显示所有匹配文本。
【解决方案3】:

这个想法是使用拆分并保留正则表达式匹配的单词。

这是一个用户安全的组件,它转义 html 并突出显示搜索多个单词的正则表达式:

Vue.component('child', {
  props: ['msg', 'search', 'effect'],
  template: '<span><span v-for="(s, i) in parsedMsg" v-bind:class="getClass(i%2)">{{s}}</span></span>',
  methods: {
    getClass: function(i) {
      var myClass = {};
      myClass[this.effect] = !!i;
      return myClass;
    },
  },
  computed: {
    parsedSearch : function () {
        return '(' + this.search.trim().replace(/ +/g, '|') + ')';
    },
    parsedMsg: function() {
        return this.msg.split(
        new RegExp(this.parsedSearch , 'gi'));
    }
  }
})

new Vue({
  el: '#app',
  }
  // ...
})

使用示例:

<div id="app">
  <child msg="My life so good and awesome, is'nt it great?" search="   life   is   good  " effect='highlight'> </child>
</div>

jsfiddle:

https://jsfiddle.net/50xvqatm/

【讨论】:

    【解决方案4】:

    您需要使用带有 3 个大括号的 {{{ foo | highlight }}},而不是带有 2 个 {{}}。两个大括号转义 HTML。

    【讨论】:

    • 我不知道这是可能的……学到了新东西……感激不尽。
    • 您好,但是如果您仍然想转义字符串,而不是突出显示,该怎么办?
    • Cette réponse n'est pas valide chez moi en 2.X 版
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2020-07-18
    • 2012-12-06
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多