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

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

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

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

Firebase

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Cloud Firestore

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

Q&A

解決済

1回答

1809閲覧

【Vue x Firestore】ドキュメントの自動IDを取得して削除機能を実装したいです

TMTN

総合スコア53

Vue.js

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

Firebase

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Cloud Firestore

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

0グッド

0クリップ

投稿2021/05/19 04:50

編集2021/05/19 17:42

#ドキュメントの自動IDを取得して削除機能を実装したいです

下記画像にある赤で囲った箇所、propsで受け取ったlistデータのlist.idを使って
ドキュメント内のフィールドの値(list.id)は取得できています。

こちらの値を参照して投稿の削除を試みましたが青で囲った自動取得したIDを参照していないためか
削除機能が実装されない状況です。

イメージ説明

イメージ説明

そもそもこのlist.idを使う必要なく、自取得された青で囲ったドキュメントIDを
取得できれば削除できるかと思われますが、青で囲った箇所の参照方法を知りたいです。

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

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

###list.vue

html

1<button class="hide-btn" @click="deletePost()">×</button>

js

1<script> 2import firebase from "firebase"; 3import Vue from "vue"; 4import VueSwal from "vue-swal"; 5Vue.use(VueSwal); 6 7export default { 8 data() { 9 return { 10 userid: "", 11 }; 12 }, 13 props: { 14 //親コンポーネントから子コンポーネントに文字列、数値、配列やオブジェクトなどの値を渡す 15 list: { 16 type: Object, 17 //list内にObject型で格納されてる 18 }, 19 index: { 20 type: Number, 21 //index内にNumber型で格納されてる 22 }, 23 }, 24 deletePost() { 25 // if (this.userid == this.$route.params.uid) { 26 firebase 27 .firestore() 28 .collection("posts") 29 .doc(this.list.id) 30 .delete(); 31 console.log(this.list.id); 32 this.$swal({ 33 title: "内容確認", 34 text: "投稿を削除しますか?", 35 icon: "warning", 36 buttons: true, 37 dangerMode: true, 38 }).then((willDelete) => { 39 if (willDelete) { 40 this.$swal("投稿を削除しました", { 41 icon: "success", 42 }); 43 this.$router.go({ 44 path: `/board/${this.$route.params.uid}`, 45 force: true, 46 }); 47 } else { 48 this.$swal("キャンセルしました。"); 49 } 50 }); 51 // } 52 }, 53}, 54</script>

#追記
イメージ説明

#追記2
イメージ説明

#追記3
イメージ説明

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

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

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

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

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

TMTN

2021/05/19 06:58

確かにdeta()の方、ドキュメント内のフィールドの値のみ参照してましたね・・ 下記のようにするよういうことでしょうか。 --------------------------------------- deletePost() { firebase .firestore() .collection("posts") .doc().id .delete(); console.log(this.list.id); --------------------------------------- 追記のようにエラーが出てしまいます。。 特定のドキュメントidを取得する方法がわからなくて・・
hoshi-takanori

2021/05/19 07:05

list.vue ではすでに取得済みの list (ひとつしかないのに list ってのも違和感がありますが) を表示してると思いますが、list.vue には肝心の doc.id が渡されてないので、list.vue でどうにかしようとしても無理です。list.vue を表示する前に、何らかの方法でデータを取得してると思いますが、その時に doc.id を覚えておく必要があるってことです。
TMTN

2021/05/19 07:48

listの名前につきましては変更しておきます。すいません。。 board.vueというコンポーネントで以下のようにlistを表示しています。 この際にdoc.idを渡してあげるということでしょうか。。 --------------------------------------- <template> <div> <Header /> <Post /> <div class="post"> <h2 class="post-tll neon">投稿一覧</h2> <div class="post-inner"> <div class="post-items"> <List v-for="(list, index) in allData" :index="index" :list="list" :key="list.id" /> <!--allDataのデータをlist関数とindex関数にそれぞれ格納--> </div> </div> </div> </div> </template> ---------------------------------------
TMTN

2021/05/19 08:55

board.vueにて以下でデータを取得していましたので his.allData.push(doc.id, doc.data());とdoc.idも覚えておくようにしました。 追記に追加したようにdoc.idは取得することがおそらくできたかと思うのですが、 そちらを以下のようにしたのですが、上手くいかないです。。 --------------------------------------- deletePost() { firebase .firestore() .collection("posts") .doc().id .delete(); console.log(this.list.id); --------------------------------------- --------------------------------------- created() { // "posts"コレクションの全ドキュメントを取得。 firebase .firestore() .collection("posts") .orderBy("time", "desc") .limit(16) .get() .then((snapshot) => { //"posts"(参照先)のスナップショットを得る snapshot.forEach((doc) => { //上記で得たデータをforEachでドキュメントの数だけ"doc"データに格納 this.allData.push(doc.id, doc.data()); //更にallDataの空箱に格納した"doc"データを格納 console.log(this.allData); }); }); }, ---------------------------------------
hoshi-takanori

2021/05/19 16:06

this.allData.push(doc.id, doc.data()); ですが、 doc.id は "hBvXkdTKSzQ4OJ9cmn03" という文字列で、 doc.data() は { description: "test", genre: "ホラー", id: "WsnY...", ... } というオブジェクトになります。 これを push(doc.id, doc.data()) すると、allData は文字列とオブジェクトが互い違いに並んだ配列になるのでは。 そうではなく、doc.iddoc.data() をセットにして allData に push する必要があるでしょうね。 また、deletePost の doc().id ってのもなんかおかしいです。
TMTN

2021/05/19 16:51

doc.iddoc.data() をセットで取得する方法がわからず、リファレンス読んで試してみたのですが互いに違う配列を取ってきてしまっているのですね。。 doc.iddoc.data() をセットで取得するにはどのように記述したらよろしいのでしょうか。。。 ごめんなさい初学者で調べてるのですがわかないもので・・
hoshi-takanori

2021/05/19 16:59

「互い違いに並んだ配列」というのは、例えば ["abc", { desc: "test 1", ... }, "def", { desc: "test 2", ... }, ...] のように、文字列、オブジェクト、文字列、オブジェクト、... というような配列のことを言ってますが、大丈夫でしょうか。 この状態でも配列の 0 番目と 1 番目、2 番目と 3 番目、... 2 * n 番目と 2 * n + 1 番目をそれぞれセットにして取り扱えれば大丈夫ではありますが、それよりも、 this.allData.push({ id: doc.id, data: doc.data() }); とする方が自然かと思います。
TMTN

2021/05/19 17:41

そちらにつきましてはその認識ですので大丈夫です。 ご説明いただきありがとうございます。 this.allData.push({ id: doc.id, data: doc.data() });とセットする方法があるのですね。 勉強になります。。本当にありがとうございます。 しかし、追記に追加したようにdataはobjectと出力されています。。
hoshi-takanori

2021/05/19 18:03

this.allData.push({ id: doc.id, data: doc.data() }); とすると allData の各要素は { id: "hBvXkdTKSzQ4OJ9cmn03", data: { description: "test", genre: "ホラー", ... } } というものになるので、それに合わせて list.vue 側も変更する必要があります。 が、赤い方の id を使ってないのであれば、 this.allData.push({ ...doc.data(), id: doc.id }); として id を上書きしてしまう方法 (その場合、list.vue の変更はほぼ不要) もありますね…。 というか、私のお示ししたコードの意味をよく理解されずに試行錯誤されているようにお見受けしますが、ちゃんと理解した方がいいですよ。
TMTN

2021/05/19 19:29

ご指摘いただきありがとうございます。 私なりに理解しようと試行錯誤しながらしているのですが・・申し訳ございません。 お陰様で解決できました。ありがとうございました。
guest

回答1

0

自己解決

データを取得する際にdoc.idを覚えさせていなかった為、
board.vueというデータを取得するコンポーネントを以下のようにしてデータと一緒にidを取得。

created() { // "posts"コレクションの全ドキュメントを取得。 firebase .firestore() .collection("posts") .orderBy("time", "desc") .limit(16) .get() .then((snapshot) => { //"posts"(参照先)のスナップショットを得る snapshot.forEach((doc) => { //上記で得たデータをforEachでドキュメントの数だけ"doc"データに格納 this.allData.push({ ...doc.data(), id: doc.id }); //更にallDataの空箱に格納した"doc"データを格納 console.log(this.allData); }); }); },

board.vueから受け取ったidを元に削除すると解決いたしました。

deletePost() { firebase .firestore() .collection("posts") .doc(this.list.id) .delete(); console.log(); this.$swal({ title: "内容確認", text: "投稿を削除しますか?", icon: "warning", buttons: true, dangerMode: true, }).then((willDelete) => { if (willDelete) { this.$swal("投稿を削除しました", { icon: "success", }); this.$router.go({ path: `/board/${this.$route.params.uid}`, force: true, }); } else { this.$swal("キャンセルしました。"); } }); }, },

投稿2021/05/20 11:26

TMTN

総合スコア53

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問