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

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

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

typetalkとは多くの機能を備えたチャットツールです。 アクセス権限の設定、ファイルの簡単共有、トピックの選別、ディスカッションの保存など、見やすく使いやすいUIで業務の効率化を図ることが可能です。

React.js

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

Q&A

解決済

2回答

1859閲覧

react useEffect axiosを使ったデータ通信の条件分岐

cuku

総合スコア108

typetalk

typetalkとは多くの機能を備えたチャットツールです。 アクセス権限の設定、ファイルの簡単共有、トピックの選別、ディスカッションの保存など、見やすく使いやすいUIで業務の効率化を図ることが可能です。

React.js

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

0グッド

0クリップ

投稿2020/02/14 04:42

編集2020/02/14 04:51

useEffectを使ってデータを取得しているのですが、データがあるときは大丈夫なんですが
データがない時にsetStateでrequestStateをEmptyにしたいです。
どう書いたらいいのでしょうか?

useEffect(() => { const fetchData = async() => { const result = await Axios.get('/user/'); const user: users[] = result.data.user.map((username: string) => ({ username })); setState({ ...state, ...{ users: user, requestState: Show}; fetchData() .catch((e) => handleError('エラーが発生しました。')); }, []);

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

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

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

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

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

guest

回答2

0

ベストアンサー

useState を使っているなら state を分けたらどうですか。

js

1const [users, setUsers] = useState<User[]>([]); 2const [requestState, setRequestState] = useState<Show | Empty>(empty); 3const [other, setOther] = useState<Other>();

こう書けるので、

js

1const result = /* リクエストする処理 */ 2 3setUsers(result.users); 4setRequestState(result.users ? Show : Empty); 5setOther(/* ... */)

このように spread 構文使って state を展開する必要がなくなくなります。
後は、何をもってデータが無いとするかは知りませんが result.users ? : の部分を好きに置き換えればよいです。

投稿2020/02/17 02:16

og24715

総合スコア832

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

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

0

以下で可能かと思います。

TypeScript

1setState({ ...state, ...{ users: user, requestState: user.length !== 0 ? Show : Empty};

もし1行が長くなるのが嫌であれば、user.length !== 0 ? Show : Empty を別の変数に入れてから、requestState に入れればいいと思います。

投稿2020/02/14 05:01

nerianighthawk

総合スコア544

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

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

cuku

2020/02/14 05:31

返信ありがとうございます!上記のようにかいたのですがaxiosでアクセスしててデータがない時は.catchに入ってしまいエラーが発生しましたとメッセージが出てしまいます。どうしたらいいでしょうか?
nerianighthawk

2020/02/14 05:35

catch に入ってしまっているのですね。 catch の引数の e の内容を console.log 等で確認することは出来ますか?
cuku

2020/02/14 05:40

consoloe.logで見てみたらTypeError: Cannot read property 'name' of nullとなっていて result.data.user.map((username: string) => のuserがnullだと言われていました
nerianighthawk

2020/02/14 06:21

TypeError: Cannot read property 'name' of null なので、 user が null なわけではなく、name という値が null だと言われています。 このソースコードは完全ですか?name を使っている箇所が見当たりませんが、どこかで name を使っていませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問