Vue过滤从vue 1迁移到vue 2

时间:2017-07-18 11:09:54

标签: vue.js vuejs2 vue-filter

我将过滤器从vue 1迁移到vue 2时遇到问题,我在这里创建了我需要的东西(突出显示与输入文本匹配的文本):

Vue.component('demo-grid', {
  template: '#grid-template',
  props: {
    filterKey: String
  },
  data: function () {
    return {
     searchParams: [
     { key: '' }
     ],
      suggestions: [
        { message: 'Foo' },
        { message: 'Bar' },
        { message: 'Foobar' },
        { message: 'pikachu' },
        { message: 'raichu' }
      ]
    }
  },
  filters: {
    highlight: function(words, query){
        var iQuery = new RegExp(query, "ig");
        return words.replace(iQuery, function(matchedTxt,a,b){
            return ('<span class=\'highlight\'>' + matchedTxt + '</span>');
        });
    }
  }
})


// bootstrap the demo
var demo = new Vue({
  el: '#demo'
})

https://jsfiddle.net/t5ac1quc/23/ VUE-1资源
https://jsfiddle.net/t5ac1quc/25/ VUE-2资源

对于所有答案,我将非常感激

1 个答案:

答案 0 :(得分:8)

Updated fiddle

<template id="grid-template">
  <ul>
    <li v-for="suggest in suggestions" v-html="highlight(suggest.message, filterKey)"></li>
  </ul>
</template>

<div id="demo">
  <form>
    Search <input v-model="searchParams.key">
  </form>
  <demo-grid :filter-key="searchParams.key"></demo-grid>
</div>
Vue.component('demo-grid', {
  template: '#grid-template',
  props: {
    filterKey: String
  },
  data: function () {
    return {
      suggestions: [
        { message: 'Foo' },
        { message: 'Bar' },
        { message: 'Foobar' },
        { message: 'pikachu' },
        { message: 'raichu' }
      ]
    }
  },
  methods: {
    highlight: function(words, query) {
      var iQuery = new RegExp(query, "ig");
      return words.replace(iQuery, function(matchedTxt,a,b){
          return ('<span class=\'highlight\'>' + matchedTxt + '</span>');
      });
    }
  }
})

new Vue({
  el: '#demo',
  data: {
    searchParams: {
      key: '',
    },
  },
});

要点:

  • 使用<script>标记存储模板时,请设置type="template"(或类似)以防止浏览器将模板作为JavaScript执行。或者更好的是使用<template>代替。
  • {{{ html }}}语法不再受支持。在Vue 2中,您必须使用v-html指令。
  • 由于v-html是指令(并且不使用{{ }}插值),因此它不使用过滤器语法。改为使用方法。
  • 您在数据范围方面遇到了一些问题。根组件需要定义其模板中使用的searchParams的数据。此外searchParams是一个数组,但您没有将其用作数组(searchParams.key);这不适用于Vue 2(必须事先正确声明所有反应数据属性)。