Vue JS'de, vue örneğinin içindeki bir yöntemden bir filtre çağırın


95

Diyelim ki böyle bir Vue örneğim var:

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?
        }
    }
}

Filtreyi şöyle bir şablonda kolayca kullanabilirim:

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

Ancak bu filtreyi bir örnek yöntemi veya hesaplanan özellik içinden nasıl kullanabilirim? (Açıkçası bu örnek önemsizdir ve gerçek filtrelerim daha karmaşıktır).

Yanıtlar:



31

Bu benim için çalıştı

  1. Filtre tanımlama

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

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

Bu yanıttaki kusur, import Vue from 'vue'zaten var olduğunda yeni bir değişkene güvenmek ve yeni bir değişken oluşturmaktır.
Jay Bienvenu

4

vuexGlobal olarak kaydedilmiş filtreleri bir vue bileşeninin yöntemler nesnesine eşlemek için benzer bir yardımcı işlev oluşturabilirsiniz :

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

Kullanım:

import { mapFilters } from './map-filters';

export default {
    methods: {
        ...mapFilters(['linebreak'])
    }
}

4

filtren böyle bir şeyse

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

cevap bu

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

0

Morris cevabını tamamlamak için, bu normalde içine filtre koymak için kullandığım bir dosya örneğidir, bu yöntemi kullanarak herhangi bir görünümde kullanabilirsiniz.

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

Bu küresel kapsamda beyan şeyler için iyi bir fikir asla, hangi windows.Vueve windows.momentkesinlikle zorunda kalmadıkça başka bir şekilde olmadan, yapar.
J.Ko

Bu konular için hiç doğru değil! Proje başına küresel olarak tanımlanmış filtreler iyi bir kuraldır!
realtebo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.