vue.js - Vue 过滤器从 vue 1 迁移到 vue 2

标签 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资源

非常感谢所有的答案

最佳答案

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(所有响应式数据属性必须预先正确声明)。

关于vue.js - Vue 过滤器从 vue 1 迁移到 vue 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45165086/

相关文章:

php - Laravel JWT 多页面结构

vue.js - 如何确定哪个 q-expansion-item 已打开?

javascript - 获取数组索引不起作用

javascript - Vue.js $scopedSlots 不适用于 Vue 实例

node.js - 模块构建失败: Error: read ECONNRESET

javascript - 从指令改变 prop 的正确方法是什么?

javascript - Vue 2 - 获取与类最接近的元素

javascript - Vuejs如何将日期与列表中的过滤器进行比较