#javascript #vue.js
Вопрос:
У меня есть данные, поступающие из API. Это массив «домов».
Код выглядит так:
lt;templategt; lt;div class="search__sort"gt; lt;input v-model="search" placeholder="Search for a house"gt; lt;button class="sort__button"gt;Pricelt;/buttongt; lt;button class="sort__button"gt;Sizelt;/buttongt; lt;/divgt; lt;div v-for="house in houses" :key="house.id" class="house"gt; lt;router-link :to="{ name: 'HouseDetails', params: { id: house.id}}" gt; lt;h2gt;ID = {{ house }}lt;/h2gt; lt;h3gt; {{ house.location.street}} lt;/h3gt; lt;img :src="house.image" /gt; lt;/router-linkgt; lt;button v-if="house.madeByMe" class="delete" @click="deleteHouse(house.id)"gt;Deletelt;/buttongt; lt;/divgt; lt;/templategt; lt;scriptgt; import axios from 'axios' export default { name: 'Houses', data(){ return { houses: [], } }, created() { this.getHouses(); }, methods: { getHouses(){ // GET request using axios with set headers const headers = { "CENSORED": "CENSORED" }; axios.get('myAPI', { headers }) .then(response =gt; this.houses = response.data); }, deleteHouse(id) { const headers = { "CENSORED": "CENSORED" }; axios.delete('myAPI' id, { headers }) .then(response =gt; { console.log(response); }) .catch(function (error) { console.log(error.response); }); }, }, } lt;/scriptgt;
Мне каким-то образом нужно реализовать фильтр по вводу текста, чтобы, например, если пользователь введет название города, он отобразил все эти дома или название улицы, чтобы отфильтровать их по улице.
Есть какие-нибудь предложения, как я могу это сделать с помощью кода, который у меня уже есть?
Комментарии:
1. Входящие данные выглядят следующим образом: « { «идентификатор»: 2, «изображение»: «myAPI/house1.jpg», «цена»: 123, «номера»: { «спальни»: 1, «ванные комнаты»: 1 }, «размер»: 500, «описание»: «oui», «местоположение»: { «улица»: «улица 20», «город»: «ассас», «почтовый индекс»: «asasdd» }, «Дата создания»: «2020-05-07», «Год постройки»: 2000, «hasGarage»: ложь, «madeByMe»: ложь } «
Ответ №1:
Вы можете использовать computed
свойство:
new Vue({ el: '#demo', data() { return { search: '', houses: [{ "id": 2, "image": "myAPI/house1.jpg", "price": 123, "rooms": { "bedrooms": 1, "bathrooms": 1 }, "size": 500, "description": "oui", "location": { "street": "street 20", "city": "assas", "zip": "asasdd" }, "createdAt": "2020-05-07", "constructionYear": 2000, "hasGarage": false, "madeByMe": false }, { "id": 3, "image": "myAPI/house1.jpg", "price": 123, "rooms": { "bedrooms": 1, "bathrooms": 1 }, "size": 500, "description": "oui", "location": { "street": "street 20", "city": "adb", "zip": "asasdd" }, "createdAt": "2020-05-07", "constructionYear": 2000, "hasGarage": false, "madeByMe": false },{ "id": 4, "image": "myAPI/house1.jpg", "price": 123, "rooms": { "bedrooms": 1, "bathrooms": 1 }, "size": 500, "description": "oui", "location": { "street": "street 20", "city": "bbb", "zip": "asasdd" }, "createdAt": "2020-05-07", "constructionYear": 2000, "hasGarage": false, "madeByMe": false }], } }, computed: { filteredHouses(){ return this.houses.filter(h =gt; h.location.city.toLowerCase().includes(this.search.toLowerCase())) } } }) Vue.config.productionTip = false Vue.config.devtools = false
lt;script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"gt;lt;/scriptgt; lt;div id="demo"gt; lt;div class="search__sort"gt; lt;input v-model="search" placeholder="Search for a house"gt; lt;button class="sort__button"gt;Pricelt;/buttongt; lt;button class="sort__button"gt;Sizelt;/buttongt; lt;/divgt; lt;div v-for="house in filteredHouses" :key="house.id" class="house"gt; lt;h3gt; {{ house.location.city}} lt;/h3gt; lt;img :src="house.image" /gt; lt;/divgt; lt;/divgt;
Комментарии:
1. Всегда ли это чувствительно к шару?
2. Эй, приятель, я исправил ответ, теперь он нечувствителен 🙂
3. Спасибо, мне просто было любопытно, всегда ли это было чувствительно, я пытаюсь узнать как можно больше, так что вы знаете, я задаю много вопросов 🙂 Теперь я все равно знаю ответ 😀
Ответ №2:
- Вы захотите различить разницу между
houses
иdisplayedHouses
таким, чтоdisplayedHouses
является вашим отфильтрованным массивом. lt;h2gt;ID = {{ house }}lt;/h2gt;
не будет хорошо играть с вашим тестированиемdisplayedHouses
будетcomputed
выглядеть что-то вроде:
computed: { /** * @return {array} List of displayed houses from search input */ displayedHouses() { if (!this.houses || !this.houses.length) { return [] } if (!this.search) { return this.houses } return this.houses.filter( (house) =gt; { return house.city.includes(this.search) || house.state.includes(this.search) // || whatever else you want }) } },
Комментарии:
1. Спасибо за ответ. Это помогает мне понять, каким бы ни был окончательный ответ 🙂 Еще раз спасибо!