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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Firebase

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1036閲覧

useStateで値が何も入らないのを直したいです

Nozomu08

総合スコア1

Firebase

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/06/01 03:22

質問失礼します!

やりたいこととできないこと
現在、setFileArrayでfileArrayに配列を入れようとしているのですが何も入りません
実施した手順とその結果
firebaseのfirestorageにデータを送り、そのurlをfirestoreに保存した
firestoreからuseEffectの中でurlを取得し、_fileArrayに入れて、コンソールで値が入ったのを確認した
その後、setFileArrayでfileArrayに_fileArrayを入れた
結果は以下でした。

[] Card.js:34 [] Card.js:32 [{…}]0: {id: 0.6918969342904946, link: "https://firebasestorage.googleapis.com/v0/b/cv-roo…=media&token=598a2bef-df4f-44e9-b899-9c60ce906d5f"}length: 1__proto__: Array(0) Card.js:32 [] Card.js:34

コード

const [fileArray, setFileArray] = useState([]); useEffect(() => { const db = firebase.firestore(); const unsubscribe = db .collection('file' + props.id.toString()) .onSnapshot((querySnapshot) => { const _fileArray = querySnapshot.docs.map((doc) => { return { id: Math.random(), ...doc.data()}; }); 32行目  console.log(_fileArray) setFileArray(_fileArray); 34行目  console.log(fileArray) props.setFileLength(fileArray.length, props.id); }); return () => { unsubscribe(); }; }, []);

何を・どのように調べたのか

上記を解決するために、以下のキーワードで検索しました。
・useState反映されない
・公式ドキュメント useState

参考にした記事のURLは以下です。
https://teratail.com/questions/225053
https://ja.reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies

何が原因だと思うか
原因は更新の仕方が間違っているからだと思います
理由は_fileArrayまではうまくできていたからです

試した解決策とその結果
setFileArray(...fileArray)にしたり、ほかの式に...fileArrayをいれてからsetFileArrayに入れたりしてみました。setTimeoutも使ってみました
しかし表示は変わらず、fileArrayには値が入らないままでした
間違ったところがありましたらご教示いただけると幸いです!

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

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

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

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

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

guest

回答1

0

ベストアンサー

間違ったところがありましたらご教示いただけると幸いです!

setFileArrayをした直後にfileArrayを参照すること自体が間違っています。

setFileArray非同期に動作しますので、fileArrayが更新されるのは次の描画時となります。

投稿2020/06/01 03:31

maisumakun

総合スコア145201

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

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

Nozomu08

2020/06/01 04:02

返信ありがとうございます、useStateは非同期なんですね! 次の描画時にならなくてもfileArrayを参照できる方法がべつであれば教えていただきたいです! useState内で非同期を待つ処理をすればうまくいくのでしょうか? useEffect内を以下に変えて試してみましたが変わらずでした、、 useEffect(() => { const db = firebase.firestore(); const unsubscribe = db .collection('file' + props.id.toString()) .onSnapshot((querySnapshot) => { const _fileArray = querySnapshot.docs.map((doc) => { return { id: Math.random(), ...doc.data()}; }); console.log(_fileArray)          変えた部分 const Wait = async () => { await new Promise(r => setTimeout(r, 1000)); setFileArray(_fileArray) }; Wait(); props.setFileLength(fileArray.length, props.id); console.log(fileArray) }); return () => { unsubscribe(); }; }, []);
maisumakun

2020/06/01 04:07

> 次の描画時にならなくてもfileArrayを参照できる方法がべつであれば教えていただきたいです! そのまま_fileArrayを使う、でいいかと思います。
Nozomu08

2020/06/01 05:24

そのまま使うのは盲点でした!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問