В Vue.js, как написать собственные фильтры в отдельном файле и использовать их в различных компонентах, объявив в main.js?

Я попытался сделать это, но это не сработает.

// filter.js

export default {
    converTimestamp: function (seconds) {
      var date = new Date(seconds * 1000);
      return date.toDateString();
    }
};

// main.js

import customFilters from './store/filters';

Ответ 1

Вот пример:

// MyFilter.js
import Vue from 'vue';

Vue.filter('myFilter', value => {
  return value.toUpperCase();
});
// main.js
import './MyFilter.js';

Если вы не хотите регистрировать фильтры по всему миру, вы можете сделать это следующим образом:

// MyFilter.js
export default function (value) {
  return value.toUpperCase();
}
// MyComponent.vue
import MyFilter from './MyFilter.js';

export default {
  filters: {
    MyFilter,
  },
};

Ответ 2

Если у вас не так много фильтров, вы также можете определить их в одном файле:

// filters.js
export default {
    filterA: () => {},
    filterB: () => {},
}

И импортировать их глобально:

// main.js
import filters from './filters';
for(let name in filters) {
    Vue.filter(name, filters[name]);
}

Ответ 3

Мы можем создать плагин для этого:

// filters.js
import Vue from 'vue'

export function truncate( text, length, suffix = '...' ) {
    if (text.length > length) {
        return text.substring(0, length) + suffix;
    } else {
        return text;
    }
}

export function json( value ) {
    return JSON.stringify(value);
}

const filters = { truncate, json }

Object.keys( filters ).forEach( key => {
    Vue.filter( key, filters[ key ] )
})

затем добавьте этот новый плагин в конфиг

export default {
  plugins: ['~/plugins/filters.js']
}