VueJS - Применение фильтров на лету
На этой неделе у меня была задача: отфильтровать список с помощью динамического фильтра.
Что я имею в виду?
Учитывая список (например, [1,2,3,4,5]), я хочу применить к нему фильтр, и фильтр может быть ничем (пустой массив) или набором фильтров (например, отфильтровать нечетные числа и отфильтровать числа больше 2 [у нас здесь два фильтра, ребята]).
Очевидно, первым делом я подумал о проблеме и о том, как ее решить. У меня возникла идея, и я создал эту структуру, чтобы помочь мне:
Основная идея здесь - создать объект, в котором я могу создать настраиваемый фильтр с идентификатором, массивом аргументов и функцией. Довольно круто (и просто), правда?
Следующим шагом было создание функции VueJS Filter, которую я мог использовать в инструкции v-for:
{ id: String, // identifier args: Array, // argument array func: Function // a function a.k.a the filter. }
Нам осталось сделать две вещи: использовать фильтр в нашем экземпляре Vue и увидеть реальный пример его работы. Итак, вот что я сделал:
Vue.filter('formatResult', function(value, functionArray) { if (functionArray) { let rList = value, aux = []; for (let i = 0, total = functionArray.length; i < total; i++) { aux = [rList].concat((functionArray[i]).args); rList = (functionArray[i]).func.apply(null, aux); } return rList; } return value; });
И последний по порядку но не по значимости:
<li v-for="item in list | formatResult filters> {{item}} </li>
Полный пример можно увидеть здесь.