掲題について、以下の状況で不明なことがあります。
■前提
・子コンポーネント(Child)のDOMにアニメーションを設定
・Child内には任意のタイミングでアニメーションを実行するanimate()
関数を実装
・親コンポーネント(Parent)において、Childに対するIntersectionObserverを設定し、交差したタイミングでChild.animate()
を実行したい
■問題
上記の場合、Parentからは以下のref
を渡す必要があります。
・IntersectionObserverを設定するためのref
(Child.Handler)
・Child.animate()
を実行するためのref
(HTMLDivElement)
ただし、それらのref
はそれぞれ型が異なるため、Child側でTypeErrorが発生してしまいます。
「React.forwardRef
において、型の異なるrefをどうやったら受け取れるか」というのが今回詰まっている箇所です。
■簡略化したコード
tsx
1// 子コンポーネント 2 3export type Handler = { 4 animate(): void 5} 6 7type Props = { 8 onAnimationEnd(): void 9 ... 10} 11 12export const Child = forwardRef<Handler, Props>((props, ref) => { 13 const { onAnimationEnd } = props 14 15 function animate() { 16 ... 17 } 18 19 useImperativeHandle(ref, () => ({ 20 animate 21 })) 22 23 return ( 24 <div 25 ref={ref} // ←forwardedRef<HTMLDivElement>を受け取らなければいけないのでTypeErrorが発生する 26 className="child" 27 > 28 ... 29 </div> 30 ) 31})
tsx
1// 親コンポーネント 2import { useRef } from 'react' 3import type { Handler } from './Child' 4 5export const Parent = (props) => { 6 const childRef = useRef({} as Handler) 7 8 useEffect(() => { 9 const intersectionObserver = new IntersectionObserver((entries) => { 10 if (entries[0].isIntersecting) { 11 childRef.animate() 12 } 13 }, {...}) 14 intersectionObserver.observe(childRef.current) 15 }, []) 16 17 return ( 18 <> 19 <Child 20 ref={crossRef} 21 /> 22 </> 23 ) 24} 25
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。