オプショナルチェーンが必要な理由
オプショナルチェーンが必要な理由がわからない
複数の要素への参照を親コンポーネントに持たせるために以下のページを参考にさせて頂きました
https://qiita.com/mackie0122/items/4ad6ca24102139dfc56a
こんな感じで実装が出来ました。
import React, {useRef} from "react"
import Test from "./test";
const A = () => {
const testRefs = useRef([])
console.log(testRefs.current[0]?.current)
return(
<div>
{["test1","test2", "test3"].map((_, i) => {
testRefs.current[i] = React.createRef()
return(
<div>
<Test
ref={testRefs.current[i]}
/>
</div>
)
})}
</div>
)
}
export default A
import React, { useEffect, forwardRef, useState, useRef } from "react"
const Test = forwardRef((props, testRef) => {
return (
<>
<div>
<div ref={testRef}>test</div>
</div>
</>
)
})
export default Test
このコードはちゃんと動作して、以下のようにコンソール画面に表示されます。
しかし、納得できないところがあったので質問させてください。
親コンポーネントのconsole.log(testRefs.current[1]?.current)
で?
を外すと以下のエラーがコンソール画面にでます。
これはなぜでしょうか?
testRefs.current[0]
がnull
だからエラーになるという事ですよね。
しかし、実際はtestRefs.current[0]?.current
はちゃんと動作します。
これはどういう事でしょうか?
動作させたらちゃんとtestRefs.current[0]?.current
で参照できる
だから?
を外してもちゃんと動作するだろうと思ったらtestRefs.current[0].current
はnull
だからcurrent
はreadできないというエラーが発生する。
わけが分かりません。
ここからは私の勝手な推測ですが
私が気づかないだけでReactは2回動作をしているのでしょうか?
?
をなくしてエラーになるのは
最初の1回目の動作でエラーとなっている。
?
を付けてちゃんと動作するのは
最初の1回目の動作ではエラーを回避しており、
2回目の動作の時にtestRefs.current[0]
に値が入って、testRefs.current[0]?.current
で正しくreadできる。
すみませんが、教えて頂けますと幸いです。
以上、よろしくお願い致します。