Trong Vue JS, gọi một bộ lọc từ một phương thức bên trong thể hiện vue


87

Giả sử tôi có một phiên bản Vue như vậy:

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

Tôi có thể dễ dàng sử dụng bộ lọc trong một mẫu như vậy:

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

Nhưng làm cách nào tôi có thể sử dụng bộ lọc này từ bên trong một phương thức phiên bản hoặc thuộc tính được tính toán? (Rõ ràng ví dụ này là tầm thường và các bộ lọc thực tế của tôi phức tạp hơn).

Câu trả lời:



29

Đây là những gì làm việc cho tôi

  1. Xác định bộ lọc

    //credit to @Bill Criswell for this filter
    Vue.filter('truncate', function (text, stop, clamp) {
        return text.slice(0, stop) + (stop < text.length ? clamp || '...' : '')
    });
    
  2. Sử dụng bộ lọc

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

Lỗ hổng trong câu trả lời này là dựa vào import Vue from 'vue'và tạo một biến mới khi một biến đã tồn tại.
Jay Bienvenu

3

Bạn có thể tạo một vuexhàm trợ giúp tương tự để ánh xạ các bộ lọc đã đăng ký toàn cầu vào đối tượng phương thức của thành phần 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;
    }, {});
}

Sử dụng:

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

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

1

nếu bộ lọc của bạn giống như thế này

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

đây là câu trả lời

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

0

Để bổ sung cho câu trả lời của Morris, đây là ví dụ về tệp tôi thường sử dụng để đặt các bộ lọc bên trong, bạn có thể sử dụng trong bất kỳ chế độ xem nào bằng cách sử dụng phương pháp này.

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

Nó không bao giờ là một ý tưởng tốt để điều khai báo trong một phạm vi toàn cầu, trong đó windows.Vuewindows.momentthực hiện, trừ khi bạn hoàn toàn có, mà không cần bất kỳ cách nào khác.
J.Ko

Không đúng chút nào cho chủ đề này! Các bộ lọc được xác định trên toàn cầu cho mỗi dự án là một quy tắc tốt!
realtebo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.