[react]useEffectとuseRefの使用
3867 ワード
データをロードした後、refを使用して参照中の値にアクセスして値を変更しようとしたとき、オブジェクトがnullでアクセスできないというエラーが発生しました.
isLoadedがtrueの場合、domオブジェクトをロードする必要があります.
setisLoadedを実行すると、domオブジェクトがすぐにマウントされるわけではありません.
これにより、マウントされていない場合、refを使用してオブジェクトにアクセスしようとすると必ずエラーが発生します.
refではなくstateを使用してinput値にアクセスすると、
上のコードを使っても大丈夫だと思います.
stateは常に最初から存在するので、いつアクセスしても問題ありません.
私が宣言したrefは、isLoadedステータスがfalseかtrueかによって異なりますので、それにアクセスするには、現在DOMにインストールされているオブジェクトにアクセスしていることを確認する必要があります.
この問題を解決するために、以下のコードを修正しました.
isLoadedの変更と入力データの変更はそれぞれ1回、同期しなければならないため(実行順序を守らなければならない)、依存値はisLoadedに設定します.
これにより、構成部品が最初にインストールされると、isLoadedはtrueになり、アップロードが完了したDOMオブジェクトがアップロードされます.その後useEffectを再実行するとisLoaded状態になるため、refを使用してinputに正常にアクセスできます.
話題を解決するのではなく、ref用のものをstateに変えたいと思っていましたが、ほほほ
refを用いることも完全に解決できる問題であることがわかる.
isLoadedがtrueの場合、domオブジェクトをロードする必要があります.
useEffect(() => {
setIsLoaded(true);
inputsRef.current[0].current.value = problem.title;
}, []);
プロセスに従ってコードを記述する場合に発生します.setisLoadedを実行すると、domオブジェクトがすぐにマウントされるわけではありません.
これにより、マウントされていない場合、refを使用してオブジェクトにアクセスしようとすると必ずエラーが発生します.
refではなくstateを使用してinput値にアクセスすると、
上のコードを使っても大丈夫だと思います.
stateは常に最初から存在するので、いつアクセスしても問題ありません.
私が宣言したrefは、isLoadedステータスがfalseかtrueかによって異なりますので、それにアクセスするには、現在DOMにインストールされているオブジェクトにアクセスしていることを確認する必要があります.
この問題を解決するために、以下のコードを修正しました.
useEffect(() => {
if (isLoaded) { // DOM이 로드된 상태이면
console.log(inputsRef.current[0]);
inputsRef.current[0].current.value = problem.title;
}
else setIsLoaded(true);
}, [isLoaded]);
本来はuserEffect関数の2番目のパラメータに空の配列を渡し、マウント後に使用します.isLoadedの変更と入力データの変更はそれぞれ1回、同期しなければならないため(実行順序を守らなければならない)、依存値はisLoadedに設定します.
これにより、構成部品が最初にインストールされると、isLoadedはtrueになり、アップロードが完了したDOMオブジェクトがアップロードされます.その後useEffectを再実行するとisLoaded状態になるため、refを使用してinputに正常にアクセスできます.
話題を解決するのではなく、ref用のものをstateに変えたいと思っていましたが、ほほほ
refを用いることも完全に解決できる問題であることがわかる.
Reference
この問題について([react]useEffectとuseRefの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@jsi06138/React-useEffect와-useRef-활용하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol