Я изучаю vuejs, и мне нужно отфильтровать цикл v-for на основе строки поиска, запускаемой по клику.Я видел много примеров фильтров, использующих вычисленные свойства непосредственно на входе, но это меня не устраивает, потому что я хочу отображать только те результаты, которые соответствуют критериям.Хотя этот код по умолчанию показывает весь список, это только для целей тестирования, в реальном приложении пользователь предварительно выберет нужную категорию.
Vue script:
new Vue({
el: '#app',
data: {
produtos: [],
busca: '',
mostrar: 8,
mostrarBase: 8,
categoriaAtiva: ''
},
methods: {
loadData: function() {
this.$http
.get('js/produtos.json')
.then(function(res) {
this.produtos = res.data;
});
},
buscar: function(busca) {
console.log(this.busca)
},
mounted: function() {
this.loadData();
}
});
JSON Object:
[
{
"categoria": "chaveiro",
"valor": 17.80,
"itens": [
{
"nome": "Caveira",
"numero": 4004
},
{
"nome": "Coração Color",
"numero": 4005
},
{
"nome": "Coração Tribal",
"numero": 4006
},
{
"nome": "Bonfim",
"numero": 4090
}]
},
{
"categoria": "tag",
"valor": 13.20,
"itens": [
{
"nome": "Árvore",
"numero": 6001
},
{
"nome": "Casa Color",
"numero": 6002
},
{
"nome": "Caveira",
"numero": 6004
},
{
"nome": "Coração Color",
"numero": 6005
}]
},
{
"categoria": "tagcarro",
"valor": 9.20,
"itens": [
{
"nome": "Kombi",
"numero": 8048
},
{
"nome": "Viagem",
"numero": 8050
},
{
"nome": "Anjo da Guarda",
"numero": 8061
},
{
"nome": "Bússola",
"numero": 8091
}]
},
{
"categoria": "necessaire",
"valor": 19.90,
"itens": [
{
"nome": "Frida",
"numero": 9013
},
{
"nome": "Olho' Grego",
"numero": 9024
},
{
"nome": "Kombi",
"numero": 9048
},
{
"nome": "Unicórnio",
"numero": 9075
}]
}
]
HTML:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue</title>
<link href="https://fonts.googleapis.com/css?family=Fira+Sans:300,300i,700,700i" rel="stylesheet">
<link rel="stylesheet" href="css/app.css">
</head>
<body>
<main id="app">
<div class="w1200">
<form v-on:submit.prevent="buscar">
<input type="text" v-model="busca">
<input type="submit" class="bt" value="buscar">
</form>
<header>
<button class="bt"
v-for="produto in produtos"
@click="function(){ mostrar = mostrarBase, categoriaAtiva = produto.categoria }">
{{produto.categoria}}
</button>
<button class="bt" @click = "categoriaAtiva = ''">todas</button>
</header>
<div v-for="produto in produtos" v-if="produto.categoria === categoriaAtiva || categoriaAtiva==='' ">
<h2>{{produto.categoria}} - R$ {{produto.valor.toFixed(2)}}</h2>
<div v-if="produto.categoria === categoriaAtiva">
mostrando {{mostrar}} de {{produto.itens.length}}
<button v-if="mostrar >= (mostrarBase * 2)" class="bt" @click="mostrar -= mostrarBase">-</button>
<button v-if="mostrar < produto.itens.length" class="bt" @click="mostrar += mostrarBase">+</button>
</div>
<ul>
<li v-for="(item,index) in produto.itens" v-if="index < mostrar && produto.categoria === categoriaAtiva || categoriaAtiva===''">
{{item.nome}} | {{item.numero}}
</li>
</ul>
</div>
</div>
</main>
<!-- Scripts -->
<script src="js/vue-core.js"></script>
<script src="js/vue-resource.js"></script>
<script src="js/vue-app1.js"></script>
</body>
</html>