【问题标题】:Vue filters migration from vue 1 to vue 2Vue 过滤器从 vue 1 迁移到 vue 2
【发布时间】:2017-12-23 05:19:06
【问题描述】:

我在将过滤器从 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 资源

我将非常感谢所有的答案

【问题讨论】:

    标签: vue.js vuejs2 vue-filter


    【解决方案1】:

    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: '',
        },
      },
    });
    

    总结:

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

    【讨论】:

    • 你好,还有一件事,你能看到这个小提琴有什么不适合的吗?我只想强调强者的第一个字母。像 Foofoo 一样,这里只突出显示“Foo”是小提琴:jsfiddle.net/t5ac1quc/30
    • 你的意思是像this?您只想突出显示第一次出现,还是只突出显示字符串的开头?
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2021-03-13
    • 2021-06-20
    • 2020-12-31
    • 2021-08-16
    • 2017-06-06
    • 2017-05-13
    • 2016-10-31
    相关资源
    最近更新 更多