質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Q&A

解決済

1回答

959閲覧

ブックマーク保存ボタンを押下されたら「色付き」のアイコン、 ブックマーク削除ボタンを押下されたら「色無し」のアイコンと切り替えたい

TMTN

総合スコア53

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

0グッド

0クリップ

投稿2021/06/06 14:58

編集2021/06/09 04:23

#ブックマーク保存ボタンを押下されたら「色付き」のアイコン、 ブックマーク削除ボタンを押下されたら「色無し」のアイコンと切り替えたい

現状、saveBookmark()というボタンを用意し、ボタンを押下されたらusersコレクションのサブコレクションbookmarksへ保存、
、deleteBookmark()というボタンを押下されたらusersコレクションのサブコレクションbookmarksから削除
されるようにロジックとしては作れております。

saveBookmark() { const ref = firebase .firestore() .collection("users") .doc(this.$route.params.uid) .collection("bookmarks") .doc(); const id = ref.id; firebase .firestore() .collection("users") .doc(this.$route.params.uid) .collection("bookmarks") .doc(id) .set({ bookmarkId: id, ...this.list, time: firebase.firestore.FieldValue.serverTimestamp() }) .then(() => { this.$swal("ブックマークに追加しました。", { icon: "success" }); }) .catch(() => { this.$swal("ブックマークを追加出来ません。", { icon: "error" }); }); }, deleteBookmark() { firebase .firestore() .collection("users") .doc(this.$route.params.uid) .collection("bookmarks") .doc(this.list.bookmarkId) .delete() .then(() => { this.$swal("ブックマークを取り消ししました。", { icon: "success" }); this.$router.go({ path: `/bookmark/${this.$route.params.uid}`, force: true }); }) .catch(() => { this.$swal("ブックマークを取り消し出来ません。", { icon: "error" }); }); },

イメージ説明

分からない事としては、ループさせている投稿に対してボタンを切り替えを実装しても投稿全てに適用され、
対象の1つの投稿に対してボタンが(色付き ⇔ 色無し)切り替わるのではなく、全ての投稿のボタンが(色付き ⇔ 色無し)切り替わってしまうと思います。

対象の投稿のみにブックマークのボタンを「色付き ⇔ 色無し」切り替える為にはどのようにしたらよいのでしょうか・・

分かる方いらっしゃいましたらお力添えを頂きたいです。

よろしくお願いいたします。

#bookmark.vue(親コンポーネント)

html

1<template> 2 <div> 3 <Header /> 4 <div class="bookmarkList flex"> 5 <h3 class="bookmarkList-title flex">{{ profileData.name }} さんのブックマーク一覧</h3> 6 <hr class="separate" /> 7 <div class="bookmarkList-posts"> 8 <paginate 9 name="paginate-bookmarkList" 10 tag="ol" 11 :list="bookmarkList" 12 :per="3" 13 v-if="bookmarkList.length !== 0" 14 > 15 <List v-for="(list) in paginated('paginate-bookmarkList')" :list="list" :key="list.id" /> 16 </paginate> 17 18 <div v-else class="nothing flex">ブックマークされた投稿はありません</div> 19 <paginate-links 20 for="paginate-bookmarkList" 21 class="pagination flex" 22 :show-step-links="true" 23 :style="bookmarkList == '' ? 'display:none;' : 'display:flex;'" 24 ></paginate-links> 25 </div> 26 </div> 27 </div> 28</template>

js

1export default { 2 data() { 3 return { 4 bookmarkData: {}, 5 paginate: ["paginate-bookmarkList"], 6 bookmarkList: [] 7 }; 8 }, 9 components: { 10 Header, 11 List 12 }, 13 created() { 14 firebase 15 .firestore() 16 .collection("users") 17 .doc(this.$route.params.uid) 18 .get() 19 .then(snapshot => { 20 this.profileData = snapshot.data(); 21 }); 22 firebase 23 .firestore() 24 .collection("users") 25 .doc(this.$route.params.uid) 26 .collection("bookmarks") 27 .orderBy("time", "desc") 28 .get() 29 .then(snapshot => { 30 snapshot.forEach(doc => { 31 this.bookmarkList.push(doc.data()); 32 }); 33 }); 34 } 35}; 36</script>

#list.vue(子コンポーネント)

html

1 2<template> 3 <div class="list"> 4 <div class="face face1 flex"> 5 <div class="content"> 6 <img 7 class="profile-icon" 8 width="50" 9 height="50" 10 :src=" 11 returnUserData() ? returnUserData().uploadedImage.fileUrl : preview 12 " 13 /> 14 <h3>{{ list.title }}</h3> 15 </div> 16 </div> 17 <div class="face face2 flex"> 18 <div class="content flex"> 19 <button class="hide-btn" @click="deletePost">×</button> 20 <p>{{ list.description }}</p> 21 <router-link :to="`/chat/${list.id}`" class="join-btn flex">ルームへ参加</router-link> 22 <!-- 「list.id」propsで親コンポーネントから取得したidを取得。--> 23 <img 24 src="../assets/ブックマーク.jpg" 25 alt="ブックマーク" 26 class="bookmark-icon" 27 @click="saveBookmark();deleteBookmark();" 28 /> 29 <p class="post-time">{{ list.time.toDate().toLocaleString() }}</p> 30 </div> 31 </div> 32 </div> 33</template>
export default { data() { return { num: 0, }, props: { list: { type: Object }, saveBookmark() { const ref = firebase .firestore() .collection("users") .doc(this.$route.params.uid) .collection("bookmarks") .doc(); const id = ref.id; firebase .firestore() .collection("users") .doc(this.$route.params.uid) .collection("bookmarks") .doc(id) .set({ bookmarkId: id, ...this.list, time: firebase.firestore.FieldValue.serverTimestamp() }) .then(() => { this.$swal("ブックマークに追加しました。", { icon: "success" }); }) .catch(() => { this.$swal("ブックマークを追加出来ません。", { icon: "error" }); }); }, deleteBookmark() { firebase .firestore() .collection("users") .doc(this.$route.params.uid) .collection("bookmarks") .doc(this.list.bookmarkId) .delete() .then(() => { this.$swal("ブックマークを取り消ししました。", { icon: "success" }); this.$router.go({ path: `/bookmark/${this.$route.params.uid}`, force: true }); }) .catch(() => { this.$swal("ブックマークを取り消し出来ません。", { icon: "error" }); }); },

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

それぞれの分岐の実装はこれからですが、質問内容の保存と削除の切り替えにつきましては、イベントに対して2つメソッドを持たせるのではなく、シンプルに以下のように2つ用意して分けてあげることにしました。

<img src="../assets/ブックマーク保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="saveBookmark" /> <imgsrc="../assets/ブックマーク未保存.jpg" alt="ブックマーク" class="bookmark-icon" @click="deleteBookmark"/>

投稿2021/06/10 11:37

TMTN

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問