ใน Vue JS เรียกตัวกรองจากวิธีการภายในอินสแตนซ์ vue


97

สมมติว่าฉันมีอินสแตนซ์ 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>

แต่ฉันจะใช้ตัวกรองนี้จากวิธีอินสแตนซ์หรือคุณสมบัติที่คำนวณได้อย่างไร (เห็นได้ชัดว่าตัวอย่างนี้เป็นเรื่องเล็กน้อยและตัวกรองจริงของฉันซับซ้อนกว่า)

คำตอบ:



31

นี่คือสิ่งที่ได้ผลสำหรับฉัน

  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'และสร้างตัวแปรใหม่เมื่อมีอยู่แล้ว
Jay Bienvenu

5

ถ้าตัวกรองของคุณเป็นแบบนี้

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

นี่คือคำตอบ

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

4

คุณสามารถสร้างvuexฟังก์ชัน like helper เพื่อแมปตัวกรองที่ลงทะเบียนทั่วโลกเข้ากับวัตถุ method ขององค์ประกอบ 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'])
    }
}

0

เพื่อเติมเต็มคำตอบของมอร์ริสนี่คือตัวอย่างของไฟล์ที่ปกติฉันใช้เพื่อใส่ฟิลเตอร์ไว้ข้างในคุณสามารถใช้ในมุมมองใดก็ได้โดยใช้วิธีนี้

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.Vueและwindows.momentทำเว้นแต่คุณจะต้องทำโดยไม่มีวิธีอื่นใด
J.Ko

ไม่จริงเลยสำหรับหัวข้อนี้! ตัวกรองที่กำหนดทั่วโลกต่อโครงการเป็นกฎที่ดี!
realtebo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.