Список фильтров с Vue.js
Я только начал работать с Vue.js, и вот что я делаю: я отображаю список продуктов, и у каждого продукта есть name
, gender
и size
. Я бы хотел, чтобы пользователи могли фильтровать товары по полу, используя данные для ввода пола.
var vm = new Vue({
el: '#product_index',
data: {
gender: "",
products: [{name: "jean1", gender: "women", size: "S"}, {name: "jean2", gender: "men", size: "S"}]
},
methods:{
updateGender: function(event){
this.gender = $(event.target).val()
}
}
}
)
<div v-for="product in products" v-if="...">
<p>{{product.name}}<p>
</div>
<input v-on:change="updateGender">
Мне удалось обновить пол, но у меня проблема с фильтрующей частью. Когда страница загружается, я не хочу никакой фильтрации. В документации они советуют использовать v-if
но он не выглядит совместимым с этой конфигурацией.
Если бы я использовал v-if
, я мог бы сделать:
v-if="product.gender == gender"
Но опять же, это не работает, когда страница загружается, потому что пол пуст. Я не мог найти обходной путь для этого.
Как мне подойти к этому вопросу?
Ответы
Ответ 1
Используйте вычисленные свойства - что-то вроде этого (Пример элементов фильтра ниже по типу)
const app = new Vue({
el: '#app',
data: {
search: '',
items: [
{name: 'Stackoverflow', type: 'development'},
{name: 'Game of Thrones', type: 'serie'},
{name: 'Jon Snow', type: 'actor'}
]
},
computed: {
filteredItems() {
return this.items.filter(item => {
return item.type.toLowerCase().indexOf(this.search.toLowerCase()) > -1
})
}
}
})
Шаблон:
<div id="app">
<div v-for="item in filteredItems" >
<p>{{item.name}}</p>
</div>
<input type="text" v-model="search">
</div>
Demo: http://jsbin.com/dezokiwowu/edit?html,js,console,output
Ответ 2
Вы можете попробовать v-if="!gender || product.gender == gender"
Ответ 3
Только что изменил @Nora ответ.
Вам необходимо изменить шаблон следующим образом:
<div id="product_index">
<div v-for="product in products" v-if="!gender || product.gender===gender">
<p>{{product.name}}<p>
</div>
<input v-on:change="updateGender">
</div>
и в файле JS как:
var vm = new Vue({
el: '#product_index',
data: {
gender: "",
products: [{name: "jean1", gender: "women", size: "S"}, {name: "jean2", gender: "men", size: "S"}]
},
methods:{
updateGender: function(event){
this.gender = event.target.value
}
}
}
);
Рабочая демонстрация: https://jsbin.com/qocuraquki/edit?html,js,console,output
Ответ 4
computed: {
filteredItems() {
return this.allStartupData.filter(item => {
let byName =
item.name.toLowerCase().indexOf(this.search.toLowerCase()) > -1;
let byDescription =
item.description.toLowerCase().indexOf(this.search.toLowerCase()) >
-1;
if (byName === true) {
return byName;
} else if (byDescription === true) {
return byDescription;
}
});
}
}
а затем вы можете перебирать фильтруемые элементы, как, например,
<v-flex v-for="(obj,index) in filteredItems" :key="index" xs12 md4>
Ответ 5
Первое: используйте что-то вроде этого: http://011.vuejs.org/api/filters.html#filterBy
Второе: напишите, если пол пуст / undefined, верните все