状態はReactの状態フックで更新されていませんか?

受付中 プログラミング
2024-12-24
hoge
Cloudinaryアカウントに画像を投稿していて、そのimageUrl状態の応答からURLを保存したいと思います。コンソールが応答URLをログに記録すると、Cloudinary URLが正しく表示されますが、機能してsetImageUrlいないようです。 セキュリティ上の理由から、Cloudinaryの詳細を「ダミー」に変更しました import React, { useState } from "react"; import "./image.css"; function Image() { const [image, setImage] = useState(""); const [imageUrl, setImageUrl] = useState(""); const postDetails = async () => { const data = new FormData(); data.append("file", image); data.append("upload_preset", "harmony"); data.append("cloud_name", "mattglwilliams"); const settings = { method: "POST", body: data }; try { const fetchData = await fetch( "https://api.cloudinary.com/v1_1/mattglwilliams/image/upload", settings ); const resData = await fetchData.json(); console.log(resData.url); if (resData) { setImageUrl(resData.url); console.log("imageUrl", imageUrl); } } catch (e) { console.log(e); } }; return ( <>
Uplaod Image setImage(e.target.files[0])} />
); } export default Image;
回答一覧
状態の更新は非同期で行われるため、状態アップデーター関数を呼び出してもsetImageUrl、状態はすぐには更新されません。最初にpostDetails関数全体が実行され、次に再レンダリングが行われます(つまり、関数コンポーネントが再度呼び出されます)。useStateフックは、imageUrl状態の更新された値を返します。 したがって、ロジックは正しいので、次のレンダリングでJSXで使用できる更新された値を取得しますが、状態アップデーターが呼び出された直後にログが更新された状態を出力するという期待は間違っています。 また、補足として、次のように渡すために新しい関数を作成する必要はありません。関数に引数を渡したくないので、次のonClickように関数を渡すことonClick={() => postDetails()}ができます。新しい機能は不要です。postDetailsonClick={postDetails}
hoge
一般的に、ロジックには何の問題もないことがわかります。if (resData)が本当に値であるかどうかを確認しtrueます。!! resdata値またはをより確実にするためにそのようにすることができますがBoolean (resData)、空のオブジェクトまたは空の配列は真の値になることに注意してください。 ステートメントにエラーがなくtry catch、restDataが真の値である場合、機能しない可能性はありsetImageUrl ()ません。
hoge