【问题标题】:In Vue JS, call a filter from a method inside the vue instance在 Vue JS 中,从 vue 实例中的方法调用过滤器
【发布时间】:2016-02-11 21:08:19
【问题描述】:

假设我有一个像这样的 Vue 实例:

new Vue({
    el: '#app',

    data: {
        word: 'foo',
    },

    filters: {
       capitalize: function(text) {
           return text.replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
       }
    },

    methods: {
        sendData: function() {
            var payload = this.$filters.capitalize(this.word); // how?
        }
    }
}

我可以像这样在模板中轻松使用过滤器:

<span>The word is {{ word | capitalize }}</span>

但是如何在实例方法或计算属性中使用此过滤器? (显然这个例子很简单,我的实际过滤器更复杂)。

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:
    this.$options.filters.capitalize(this.word);
    

    http://vuejs.org/api/#vm-options

    【讨论】:

    • 你...美女!!
    • 这在 Nuxt 环境中对我不起作用。 this.$options 没有 filters 属性。
    • 在 NuxtJS 中使用 this.$root.$options.filters
    • 你在谷歌上搜索并发现它之前留下多年的东西就是这么简单..!谢谢!
    【解决方案2】:

    这对我有用

    1. 定义过滤器

      //credit to @Bill Criswell for this filter
      Vue.filter('truncate', function (text, stop, clamp) {
          return text.slice(0, stop) + (stop < text.length ? clamp || '...' : '')
      });
      
    2. 使用过滤器

      import Vue from 'vue'
      let text = Vue.filter('truncate')(sometextToTruncate, 18);
      

    【讨论】:

    • 这个答案中的缺陷是依赖import Vue from 'vue' 并在一个已经存在的情况下创建一个新变量。
    【解决方案3】:

    如果你的过滤器是这样的

    <span>{{ count }} {{ 'item' | plural(count, 'items') }}</span>  
    

    这就是答案

    this.$options.filters.plural('item', count, 'items')
    

    【讨论】:

      【解决方案4】:

      您可以创建一个类似vuex 的辅助函数来将全局注册的过滤器映射到 vue 组件的方法对象中:

      // map-filters.js
      export function mapFilters(filters) {
          return filters.reduce((result, filter) => {
              result[filter] = function(...args) {
                  return this.$options.filters[filter](...args);
              };
              return result;
          }, {});
      }
      

      用法:

      import { mapFilters } from './map-filters';
      
      export default {
          methods: {
              ...mapFilters(['linebreak'])
          }
      }
      

      【讨论】:

      • 这是对reduce 方法的错误使用。结合使用mapObject.entries 会更好。
      【解决方案5】:

      为了补充 Morris 的回答,这是我通常用来在其中放置过滤器的文件示例,您可以使用此方法在任何视图中使用。

      var Vue = window.Vue
      var moment = window.moment
      
      Vue.filter('fecha', value => {
        return moment.utc(value).local().format('DD MMM YY h:mm A')
      })
      
      Vue.filter('ago', value => {
        return moment.utc(value).local().fromNow()
      })
      
      Vue.filter('number', value => {
        const val = (value / 1).toFixed(2).replace('.', ',')
        return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
      })
      Vue.filter('size', value => {
        const val = (value / 1).toFixed(0).replace('.', ',')
        return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
      })
      

      【讨论】:

      • 在全局范围内声明东西从来都不是一个好主意,windows.Vuewindows.moment 会这样做,除非你绝对必须这样做,没有任何其他方式。
      • 这个主题完全不正确!每个项目的全局定义过滤器是一个很好的规则!
      猜你喜欢
      • 2018-12-31
      • 2017-08-07
      • 2018-09-16
      • 2017-05-13
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多