現在簡易的な飲食店予約アプリを下記順序で作成中です。
① バックエンド作成(Laravel)
② フロントエンド作成(Vue.cli)
③ 繋ぎ込み
*実装したいこと
フロントエンド側で店舗ごと、ユーザーごとにお気に入り登録できるようにしたい
例えばログインユーザーがAの店舗をお気に入りしたら、Aの店舗だけいいねボタンのハートマークの表示変更
*解決したいこと
1つの店舗のいいねボタンを押すと全部の店舗にもハートマークの表示が変更される
以下、該当コードとなります。
ご教授頂けますと幸甚です。
Vue.js
<template> <div class="home"> <div class="flex"> <div class="header left"> <commonHeader /> </div> <div class="search-container right"> <div class="flex"> <select name="shopsArea" id="" v-model="searchArea"> <option value="">エリアで検索</option> <option value="東京">東京</option> <option value="大阪">大阪</option> <option value="福岡">福岡</option> </select> <select name="shopsGenre" id="" v-model="searchGenre"> <option value="">ジャンルで検索</option> <option value="寿司">寿司</option> <option value="焼肉">焼肉</option> <option value="居酒屋">居酒屋</option> <option value="イタリアン">イタリアン</option> <option value="ラーメン">ラーメン</option> </select> <input type="text" v-model="searchWords" placeholder="店名で検索"> </div> </div> </div> <div class="shops" id="shop-flex"> <div class="shop" v-for="shop in filteredShops" :key="shop.id"> <img :src="shop.url"> <div class="shop-info"> <p class="shop-name">{{ shop.name }}</p> <div class="area-genre"> <span class="shop-area">#{{ shop.area }}</span> <span class="shop-genre">#{{ shop.genre }}</span> </div> <div class="flex"> <button @click="shopDetail(shop.id)">詳しく見る</button> <div class="LikesIcon" @click="toggleHeart()"> <i class="fa-heart LikesIcon-fa-heart" :class="{ heart: isActive , fas: isActive ,far: !isActive }"></i> </div> </div> </div> </div> </div> </div> </template> <script> import commonHeader from '../components/commonHeader'; export default { data() { return { searchArea: '', searchGenre: '', searchWords: '', isActive: false, shops: [ { id: 1, name: '仙人', area: '東京', genre: '寿司', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 2, name: '仙人', area: '大阪', genre: '焼肉', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 3, name: '仙人', area: '福岡', genre: 'イタリアン', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 4, name: '仙人', area: '東京', genre: '寿司', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, { id: 5, name: '仙人', area: '大阪', genre: '寿司', url: 'https://coachtech-matter.s3-ap-northeast-1.amazonaws.com/image/sushi.jpg' }, ], }; }, components: { commonHeader }, methods: { toggleHeart() { if (!this.isActive) { this.isActive = true; } else { this.isActive = false; } }, shopDetail(shop_id) { this.$router.push({path: '/shopdetail/'+ shop_id, params:{shop_id:shop_id}}); } }, computed: { filteredShops() { const shopsArray = []; for (const i in this.shops) { const shop = this.shops[i]; if (shop.area.indexOf(this.searchArea) !== -1 && shop.genre.indexOf(this.searchGenre) !== -1 && shop.name.indexOf(this.searchWords) !== -1) { shopsArray.push(shop); } } return shopsArray; } } }; </script>