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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

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

Q&A

0回答

494閲覧

Reactで非同期処理で取得した値をもとにさらに非同期処理を行う

maskmelon

総合スコア63

Firebase

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

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

0グッド

0クリップ

投稿2020/10/31 05:26

編集2020/10/31 05:27

Reactとfirebaseで本を共有するアプリを作っており、フレンドページに行くとログインユーザーのbookListを参照して共通する本を表示する機能を実装しています。

Friendコンポーネントのマウント時にFirestoreからフレンドユーザーの情報を取得

取得した情報を元にログインユーザーと共通の本を見つける

という処理まで書いたのですが、sharedBooksの中身はisbnコードだけなので、それを使って外部APIを叩いてタイトルや著者などの情報を取得したいです。

副作用を生じる処理なのでuseEffectを書こうと思ったのですが、マウント時にはsharedBooksの中身は空なのでうまく行きません。

実現する方法はあるでしょうか?あるいはこういう処理を行うこと自体推奨されないのでしょうか?

js

1const Friend = ({ friendId }) => { 2 const classes = useStyles(); 3 const [loginUser, setLoginUser] = useRecoilState(loginUserState); 4 const [friend, setFriend] = useState(null); 5 6// フレンドユーザーの情報を取得 7 useEffect(() => { 8 db.collection('users') 9 .doc(friendId) 10 .get() 11 .then(doc => setFriend(doc.data())); 12 }, [friendId]); 13 14 if (!friend || !loginUser) { 15 return <p>Loading...</p>; 16 } 17 18// ログインユーザーとフレンドユーザーのbookListを比較して共通の本を見つける 19 const arr = [...loginUser.bookList, ...friend.bookList]; 20 const duplicateArr = arr.filter( 21 item => 22 loginUser.bookList.some(book => book.isbn === item.isbn) && 23 friend.bookList.some(book => book.isbn === item.isbn) 24 ); 25 const sharedBooks = duplicateArr.filter((item, index, array) => { 26 return array.findIndex(item2 => item.isbn === item2.isbn) === index; 27 }); 28 29 return ( 30 <Grid item> 31 <Box boxShadow={7} bgcolor="background.paper"> 32 <Link href={`/users/${friend.twitterUsername}/bookShelf`}> 33 <Card className={classes.root} variant="outlined"> 34 <div className={classes.details}> 35 <CardContent className={classes.content}> 36 <Box display="flex"> 37 <Avatar alt="profile-img" src={friend.twitterProfileImgUrl} /> 38 <Box m={1} /> 39 <Box> 40 <Typography variant="subtitle1"> 41 {friend.twitterDisplayName} 42 </Typography> 43 <Typography variant="subtitle2" color="textSecondary"> 44 @{friend.twitterUsername} 45 </Typography> 46 </Box> 47 </Box> 48 <Box m={2} /> 49 <Typography variant="subtitle2" color="primary"> 50 共通の本が{sharedBooks.length}冊あります 51 </Typography> 52 </CardContent> 53 </div> 54 </Card> 55 </Link> 56 </Box> 57 </Grid> 58 ); 59}; 60 61export default Friend;

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

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

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

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

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

hentaiman

2020/10/31 06:34

useEffectを複数書けることを知らないが故の疑問ってところでしょうか
maskmelon

2020/10/31 09:01 編集

回答くださりありがとうございます。 二つ目のuseEffectの中でif (!loginUser || !friend) { return } を先頭に置いて、依存配列にloginUserとfriendを追加するとうまく行きました。 この書き方は一般的なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問