ããã§ã ref.current
ã«å²ãåœãŠãããšãã§ããŸããäŸãåç
§ããŠãã ããïŒ https ïŒ//reactjs.org/docs/hooks-faq.html#is -there-something-like-instance-variables
ããã«å€ãå²ãåœãŠãããšãããšããšã©ãŒãçºçããŸãïŒ Cannot assign to 'current' because it is a constant or a read-only property.
@types/react
ããã±ãŒãžã䜿çšããããšããŸããããåé¡ãçºçããŸãããindex.d.ts
ã®Definitions by:
ãåç
§ïŒå¿çãPRãããã ããã°å¹žãã§ãã éåžžã«ç°¡åãª1è¡ã®å€æŽã§ããå¿ èŠããããŸãð
@ferdaber ã
ããã«ã¡ã¯ãç§ã¯ãã®åé¡ãéžã¶ã®ã奜ãã§ãã ç§ã¯typescriptãåããŠäœ¿çšããã®ã§ïŒããã1é±éïŒããªãŒãã³ãœãŒã¹ãžã®æåã®è²¢ç®ã«ãªããŸãã
node_modules / @ types / react / index.d.tsã確èªããŸãããã61è¡ç®ã«æ¬¡ã®ã³ãŒãããããcurrentãèªã¿åãå°çšãšããŠå®£èšããŠããŸãã
interface RefObject<T> {
readonly current: T | null;
}
ãããåé¡ã§ããã°ãç§ã¯è§£æ±ºã§ããŸãã ç§ã®æåã®PRã®ã¬ã€ããããŠããããŸããïŒ
ãæéãããã ãããããšãããããŸã:)
ã¯ãããã®è¡ã®readonly
修食åãåé€ããŠããã ãã§ãã
React.useRef
ã¯ã$ current
ããããã£ãreadonly
MutableRefObject
ãè¿ããŸãã åé¡ã¯ãrefãªããžã§ã¯ãåãçµ±äžããå¿
èŠããããã©ããã ãšæããŸãã
ãããã¯çµ±åãããã¹ãã§ãããReactã©ã³ã¿ã€ã ã¯React.createRef()
ã«ãã£ãŠäœæãããcurrent
ããããã£ã«å¶éããªãããªããžã§ã¯ãèªäœã¯å°å°ãããŠããŸããåçµãããŠããŸããã
ããã§ã¯ãããŸããã åçµãããŠããªãå Žåã§ããæ£ãã䜿çšæ³ãä¿èšŒããããã«æå³çã«èªã¿åãå°çšã®ãŸãŸã«ããŠãããŸãã nullãå²ãåœãŠãããšãã§ããããã«ããããšãæ確ã«ç€ºããã«nullã§åæåãããåç §ã¯ãReactã«ãã£ãŠç®¡çãããåç §ãšããŠè§£éãããŸããã€ãŸããReactã¯çŸåšããææããã衚瀺ããŠããã ãã§ãã
nullå€ã§å§ãŸãå¯å€refãªããžã§ã¯ããå¿
èŠãªå Žåã¯ããžã§ããªãã¯åŒæ°ã«ã| null
ãæå®ããŠãã ããã Reactã§ã¯ãªããææãããŠãããããå€æŽå¯èœã«ãªããŸãã
ç§ã¯ä»¥åã«ãã€ã³ã¿ããŒã¹ã®èšèªãé »ç¹ã«äœ¿çšããããšããããæææš©ã¯ãããã®èšèªã§_éåžžã«_éèŠã§ãããããããããããã¯ç§ã«ãšã£ãŠç解ãããããã®ã§ãã ãããŠããããrefãšã¯äœãããã€ã³ã¿ãŒã§ãã .current
ã¯ãã€ã³ã¿ãéåç
§ããŠããŸãã
ããã¯å
¬å¹³ã§ããç§ã¯React.createRef()
ããã«ããŒé¢æ°ãšããŠäœ¿çšããŠããã€ã³ã¿ãŒãäœæããŸãããããã¯ãReactãref
ã®å°éå
·ãšããŠæž¡ãããªãéãããã€ã³ã¿ãŒã管çããªãããã§ããåãæ§é ã®åçŽãªãã€ã³ã¿ãªããžã§ã¯ããäœæããŸãã
createRef
ãå€æŽããŠåããªãŒããŒããŒãããžãã¯ã䜿çšããããšãã§ããŸãããåŒæ°ããªããããæ¡ä»¶ä»ãã®åãè¿ãå¿
èŠããããŸãã | null
ãå«ãããšã$ïŒ MutableRefObject
ãè¿ãããŸããå«ããªãå Žåã¯ãïŒäžå€ïŒ RefObject
ãªããŸãã
ãã ãã strictNullTypes
ãæå¹ã«ããŠããªãå Žåã¯æ©èœããŸããïŒ
ð€
_do_ã§strictNullTypes
ãæå¹ã«ãªã£ãŠããã³ãŒãã«å¯ŸããŠãééã£ãã³ãŒããç°¡åã«èšè¿°ã§ããããã«ããå¿
èŠããããŸããïŒ
ãã®åé¡ãäœæãããšãããã®| null
ã®éè² è·ããã§ã«ããããšã«æ°ã¥ããŠããŸããã§ããã ããŸãäžè¬çãªãã¿ãŒã³ã§ã¯ãªãã®ã§ããã®ãããªãã®ãååšãããšã¯æã£ãŠããŸããã§ããã ç§ã¯ããã¥ã¡ã³ãã§ãããã©ã®ããã«èŠéããã®ãããããŸããããããã¯éåžžã«ããææžåããã説æãããŠããŸãã useRef
ãšcreateRef
ãçµ±åãããå Žåãé€ããŠããããåé¡ãªãéããŠãåé¡ãããŸããã
åé¡èªäœã¯createRef
useRef
ã«åºã¥ããŠããã®ã§ã createRef
ã®éåç
§ãã€ã³ã¿å€ãçŽæ¥å€æŽãã人ã¯ã»ãšãã©ããªãã®ã§ããããéããŠãåé¡ãããŸããã
ãã®ãªãŒããŒããŒããã¿ãŒã³ãããŸãæ©èœãããã©ããçåã«æããŸããããã¯ã®ããã¥ã¡ã³ããèŠããšãããã©ã«ãå€ã§useRef
ãããã€ã䜿çšãããŠããããšãããããŸãããã®å Žåã .current
ã®å€ã¯æ±ºããŠæ£ãããªãå¯èœæ§ããããŸãã nullã§ãããnull以å€ã®ã¢ãµãŒã·ã§ã³æŒç®åãåžžã«äœ¿çšããŠãããä¹ãè¶ããã®ã¯ããŠãŒã¶ãŒã«ãšã£ãŠã¡ãã£ãšé¢åãªå ŽåããããŸãã
åæå€ãæå®ãããŠããå Žåã¯æ»ãå€ãå¯å€ã§ããããçç¥ãããŠããå Žåã¯äžå€ã§ããæ¹ãçã«ããªã£ãŠããŸããïŒ åæå€ãæå®ãããŠããå Žåãrefã¯ããããref
ãä»ããŠã³ã³ããŒãã³ãã«æž¡ããããã€ã³ã¹ã¿ã³ã¹å€æ°ã®ããã«äœ¿çšãããŸãã äžæ¹ãã³ã³ããŒãã³ãã«æž¡ãããã ãã®åç
§ãäœæããå Žåãåæå€ã¯ããããæäŸãããŸããã
ããããããšãèããŠããŸããã @Kovenskyã©ãæããŸããïŒ
@ferdaber useRef
ã¯çŸåšå®çŸ©ãããŠããããã | null
ãšåæå€null
ãå«ãŸãªãäžè¬çãªåŒæ°ãæ瀺çã«æå®ããªãéããåžžã«å¯å€ã§ãããnull蚱容ã§ã¯ãããŸããã
ã³ã³ããŒãã³ãã«æž¡ãããåç
§ã¯ã null
ã§åæåããå¿
èŠããããŸããããã¯ããªãªãŒã¹æã«Reactãåç
§ãèšå®ããããã§ãïŒæ¡ä»¶ä»ãã§ããŠã³ããããŠããã³ã³ããŒãã³ããã¢ã³ããŠã³ãããå Žåãªã©ïŒã å€ãæž¡ããã«useRef
ãæå®ãããšã代ããã«undefined
ãéå§ãããããã | null
ã ããæ°ã«ããå¿
èŠããããã®ã«| undefined
ãè¿œå ããå¿
èŠããããŸãã | null
ã
Reactã®ããã¥ã¡ã³ããšåæå€ãªãã§useRef
ã䜿çšããéã®åé¡ã¯ãReactããŒã ãnull
ãšundefined
ã®éããããŸãæ°ã«ããŠããªãããã«èŠããããšã§ãã ããã¯ãããŒã®ããšãããããŸããã
ãšã«ãããç§ãuseRef
ãå®çŸ©ããæ¹æ³ã¯ã @ bschlenkã®ãŠãŒã¹ã±ãŒã¹ã«æ£ç¢ºã«é©åããŸãããäžèšã®çç±ã«ããã null
ããçç¥ããããå€ã§ããã ãã§ãã
ããããã£ãšããèŠããšãããããããŸãããããŠããã©ã¡ãŒã¿ãŒãªãã§ReactãœãŒã¹ã§undefined
ãšããŠåæåãããŠããã®ã¯èå³æ·±ãããšã§ãã ãã£ãããã®ã§ããã¹ãŠãæ¡è²ã§ããããã¯ðã®ããã«èãããŸã
| null
ãå«ãããã©ããã«ãããããã current
ã®ã¿ã€ããnullã«ãªãå¯èœæ§ããããå¯å€æ§ãå€æŽãããã ãã§ãããšããã®ã¯å°ãå¥åŠãªããšã§ãã ãŸããReactããã¥ã¡ã³ãã¯åžžã«æ瀺çã«nullãæž¡ãã®ã§ãinitialValueãçç¥ããŠãæå¹ã§ããïŒ
äžè¬çã«ã¯ããã§ã¯ãªããå°ãªããšãéå»ã«ãããããã¥ã¡ã³ãã§ReactããŒã ãããããæ©èœãããšããŠããããããçç¥ããããšãæå³ããŠããªããšææãããšãã
ããšãã°ãã³ã³ããã¹ããundefined
ã§éå§ããå Žåã§ãã createContext
ã®æåã®åŒæ°ãå¿
èŠã«ãªãã®ã¯ãã®ããã§ãã å®éã«undefined
ãæž¡ãå¿
èŠããããŸãã
äžéšã®äœ¿çšæ³ã§ã¯ããã©ã¡ãŒã¿ã䜿çšããŠããªãããã§ãã
https://reactjs.org/docs/hooks-faq.html#is -there-something-like-instance-variables
https://reactjs.org/docs/hooks-faq.html#how -to-get-the-previous-props-or-state
https://reactjs.org/docs/hooks-faq.html#how -to-read-an-often-changing-value-from-usecallback
@ferdaberããã¯åœŒããããã®ã¿ã€ããæ°ã«ããŠããªãããã§ãã useRef()
ïŒåŒæ°ãªãïŒã®current
ã®ã¿ã€ãã¯ã©ãããã¹ãã§ããïŒ undefined
ïŒ any
ïŒ ãããäœã§ãããäžè¬çãªåŒæ°ãäžãããšããŠããããã¯undefined
ã§|
ç·šéãããå¿
èŠããããŸãã _ãããŠ_ãããïŒã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžãšããŠã ãã§ãªãïŒreactèŠçŽ refãšããŠäœ¿çšããrefã§ããå ŽåãReactã¯ããã«null
| null
å¿
èŠã§ãã
ããã§ã current
ã$ïŒ$ T
ïŒ$ã§ã¯ãªãT | null | undefined
ã§ããããšãããããŸãã
// you should always give an argument even if the docs sometimes miss them
// $ExpectError
const ref1 = useRef()
// this is a mutable ref but you can only assign `null` to it
const ref2 = useRef(null)
// this is also a mutable ref but you can only assign `undefined`
const ref3 = useRef(undefined)
// this is a mutable ref of number
const ref4 = useRef(0)
// this is a mutable ref of number | null
const ref5 = useRef<number | null>(null)
// this is a mutable ref with an object
const ref6 = useRef<React.CSSProperties>({})
// this is a mutable ref that can hold an HTMLElement
const ref7 = useRef<HTMLElement | null>(null)
// this is the only case where the ref is immutable
// you did not say in the generic argument you want to be able to write
// null into it, but you gave a null anyway.
// I am taking this as the sign that this ref is intended
// to be used as an element ref (i.e. owned by React, you're only sharing)
const ref8 = useRef<HTMLElement>(null)
// not allowed, because you didn't say you want to write undefined in it
// this is essentially what would happen if we allowed useRef with no arguments
// to make it worse, you can't use it as an element ref, because
// React might write a null into it anyway.
// $ExpectError
const ref9 = useRef<HTMLElement>(undefined)
ããããã®DXã¯ç§ã®ããã«æ©èœããããã¥ã¡ã³ãã¯A ++ãªã®ã§ãã»ãšãã©ã®äººãæ··ä¹±ããããšã¯ãªããšæããŸãã ãã®ç²Ÿç·»åã«æè¬ããŸãïŒ æ£çŽãªãšãããtypedocã§ãã®åé¡ãããŒããªã³ã¯ããå¿ èŠããããŸã:)
useRef<T>()
ããµããŒããã useRef<T | undefined>(undefined)
ãšåãããã«åäœãããå ŽåããããŸãã ãã ããããã䜿çšããŠäœæããrefã¯ãã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžãšåæ§ã«ãèŠçŽ refãšããŠäœ¿çšããããšã¯ã§ããŸããã
åé¡ã¯...èš±å¯ãããŠããäžè¬çãªåŒæ°ã_äžããªã_å Žåã¯ã©ããªããŸããïŒ TypeScriptã¯{}
ãæšæž¬ããŸãã æ£ããããã©ã«ãã¿ã€ãã¯unknown
ã§ããã䜿çšã§ããŸããã
次ã®ã³ãŒãã§ãã®ãšã©ãŒãçºçããŸãïŒ
~~~ js
//..ã
intervalRef = useRefãšããŸã
//..ã
useEffectïŒïŒïŒ=> {
const interval = setIntervalïŒïŒïŒ=> {/ *äœãããã* /}ã1000ïŒ;
intervalRef.current =éé; //ãã®è¡ã§ãšã©ãŒãçºçããŠããŸã
return () => {
clearInterval(intervalRef.current);
}
}ïŒ
//..ã
ããããŠãããã§readonly
ãåé€ãããšã次ã®ããã«æ©èœããŸãããjs
ã€ã³ã¿ãŒãã§ã€ã¹RefObject
èªã¿åãå°çšé»æµïŒT | ãã«;
}
~~~
ç§ã¯reackããã¯ãštypescriptã®äž¡æ¹ãåããŠäœ¿çšããã®ã§ïŒäžç·ã«è©ŠããŠã¿ãã ãã§ãïŒãã³ãŒããééã£ãŠããå¯èœæ§ããããŸã
ããã©ã«ãã§ã¯ã null
ã®ããã©ã«ãå€ã䜿çšããŠåç
§ãäœæãããã®æ±çšãã©ã¡ãŒã¿ãŒãæå®ãããšãReactã«åç
§ããææããããæå³ãéç¥ããŸãã ææããŠããrefãå€æŽã§ããããã«ããå Žåã¯ã次ã®ããã«å®£èšããå¿
èŠããããŸãã
const intervalRef= useRef<NodeJS.Timeout | null>(null) // <-- the generic type is NodeJS.Timeout | null
@ferdaberããããšãããããŸãïŒ
ãããããã«æ®µéçã«é²ããŠã current
ã®ãªã¿ãŒã³ã¿ã€ããèŠããšãããããT | null
T
ã§ããå¿
èŠããããŸããïŒ ããã¯ã®åºçŸã«ããããã¹ãŠã®åç
§ãnull
ã«ãªãå¯èœæ§ãããå ŽåããããŸããç¹ã«ã useRef
ãnull以å€ã®åæååã§åŒã³åºãããããšããããããŸãã
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065#issuecomment -446660394ã®åªããäŸã®ãªã¹ãããç¶ããŠã次ã®ããã«èšè¿°ããŸãã
const numericRef = useRef<number>(42);
numericRef.current
ã®ã¿ã€ãã¯ã©ãããã¹ãã§ããïŒ number | null
ã§ããå¿
èŠã¯ãããŸããã
ã¿ã€ããšé¢æ°ã次ã®ããã«å®çŸ©ããå ŽåïŒ
interface RefObject<T> {
current: T;
}
function useRef<T>(initialValue: T): RefObject<T>;
function useRef<T>(initialValue: T|null): RefObject<T | null>;
function createRef<T>(): RefObject<T | null>;
ããã«ããã次ã®äœ¿çšæ³ãšã¿ã€ããçæãããŸãã
const r1 = useRef(42);
// r1 is of type RefObject<number>
// r1.current is of type number (not number | null)
const r2 = useRef<number>(null);
// r2 is of type RefObject<number | null>
// r2.current is of type number | null
const r3 = useRef(null);
// r3 is of type RefObject<null>
// r3.current is of type null
const r4 = createRef<number>();
// r4 is of type RefObject<number | null>
// r4.current is of type number | null
äœãåé¡ããããŸããïŒ
ReactããŒã ã«ãããšãããã©ã¡ãŒã¿ãŒåãããŠããªãuseRef
ã®ã¿ã€ãã¯äœã§ããïŒãã«å¯Ÿããçãã¯ãïŒããã¥ã¡ã³ãã«ããããããïŒãã®åŒã³åºããæ£ãããªããšããããšã§ãã
DOM /ã³ã³ããŒãã³ãåç §ã®äŸ¿å©ãªãªãŒããŒããŒããšããŠã| null _specifically_ã䜿çšããŠãªãŒããŒããŒããè¿œå ããŸãããããã¯ãããããåžžã«nullã§å§ãŸãââãã¢ã³ããŠã³ãæã«åžžã«nullã«ãªã»ãããããçŸåšã®èªåã§åå²ãåœãŠããããšã¯ãªããReactã®ã¿ã§ããããã§ãã
èªã¿åãå°çšã«ã¯ãçã®JavaScriptããªãŒãºãªããžã§ã¯ã/ã²ãã¿ãŒã®ã¿ã®ããããã£ã®è¡šçŸããããè«çãšã©ãŒãé²ãããã®æ©èœããããŸãã
ãšã«ããå€ãnullã«åæåãããšãã«ãnullãåãå ¥ããªããšããäžè¬çãªåŒæ°ãäž¡æ¹ãšãäžããå Žåã«ã®ã¿ãå¶ç¶ã«ãããè¡ãããšãã§ããŸãã ãã®ä»ã®å Žåã¯å€æŽå¯èœã§ãã
ãããã¯ãã RefObject<T>
ãšæ¯èŒããŠã MutableRefObject<T>
ã§ã¯ãã§ã«| null
ã®ã±ãŒã¹ãåé€ãããŠããããšãããããŸãã ãããã£ãŠã useRef<number>(42)
ã®ã±ãŒã¹ã¯ãã§ã«æ£ããæ©èœããŠããŸãã 説æããŠãããŠããããšãïŒ
createRef
ã§äœãããå¿
èŠããããŸããïŒ çŸåšãäžå€ã®RefObject<T>
ãè¿ããŸããããã¯ãã³ãŒãããŒã¹ã§åé¡ãåŒãèµ·ãããŠããŸããããããæž¡ããïŒå¯å€ã®ïŒ useRef
refãªããžã§ã¯ããšåãããã«äœ¿çšãããããã§ãã createRef
ã®å
¥åã埮調æŽããŠãå¯å€ã®refãªããžã§ã¯ãã圢æã§ããããã«ããæ¹æ³ã¯ãããŸããïŒ
ïŒãããŠã ref
å±æ§ã¯RefObject<T>
Ref<T>
ã§ãããšå®çŸ©ãããŠããããããã¹ãŠãäžå€ã«ãªããŸããããã¯ç§ãã¡ã«ãšã£ãŠå€§ããªåé¡ã§ãã useRef
ããã®åç
§ã forwardRef
åŒã³åºããéããŠäžå€ã§ãããšããäºå®ãå©çšããããšã¯ã§ããŸãããïŒ
ããŒã...ããããåãããªãã¯ã䜿çšã§ããŸãããåŒæ°ããªãïŒãããŠåžžã«nullã§å§ãŸãïŒãšããçç±ã ãã§ãæ¡ä»¶ä»ãã¿ã€ããå¿ èŠã«ãªããŸãã
: null extends T ? MutableRefObject<T> : RefObject<T>
ã¯ãåãããžãã¯ãå®è¡ããŠäœ¿çšããå¿
èŠããããŸãã nullãå
¥ããããšèšã£ãå Žåãããã¯å¯å€ã§ãããããã§ãªãå Žåã§ããçŸåšã®æå³ã§ã¯äžå€ã§ãã
ããã¯ãšãŠãããèãã§ãã createRef
ã¯ãã©ã¡ãŒã¿ãåãåããªããããããããåžžã«| null
ãªãã·ã§ã³ãå«ããå¿
èŠããããŸãïŒ useRef
ãšã¯ç°ãªããŸãïŒããããã£ãŠãããããMutableRefObject<T | null>
ãšèšãå¿
èŠããããŸããïŒ
ç§ã¯ã©ã¡ããTSã§åäœãããããšãã§ããŸããã§ããã ããã§æ§æãããTSãã¬ã€ã°ã©ãŠã³ãã¯æ¬¡ã®ãšããã§ãã
https://tinyurl.com/y75c32y3
ã¿ã€ãã¯åžžã«MutableRefObject
ãšããŠæ€åºãããŸãã
forwardRef
ã§äœãã§ãããšæããŸããïŒ ref
ãRef<T>
ã§ãããšå®£èšããŸãããããã«ã¯MutableRefObject
ã®å¯èœæ§ã¯å«ãŸããŠããŸããã
ïŒåé¡ãåŒãèµ·ãããŠãããŠãŒã¹ã±ãŒã¹ã¯ãé¢æ°refãŸãã¯refãªããžã§ã¯ãã®ããããã§ããrefã®é
åãåãåããæž¡ãããšãã§ããåäžã®çµåãããref [é¢æ°ref]ãäœæããmergeRefs
é¢æ°ã®ãŠãŒã¹ã±ãŒã¹ã§ãã次ã«ããã®çµââåãããrefã¯ãé¢æ°refã®å Žåã¯åŒã³åºãããrefãªããžã§ã¯ãã®å Žåã¯.current
ãèšå®ããããšã«ãããæäŸããããã¹ãŠã®refã«çä¿¡åç
§èŠçŽ ãé
ä¿¡ããŸããäžå€ã®RefObject<T>
ãšMutableRefObject<T> in Ref<T>
ãå«ãŸããŠããªããããããã¯å°é£ã§ããforwardRefãšRefã«ã€ããŠå¥ã
ã®åé¡ãæèµ·ããå¿
èŠããããŸãã
äžèšã®çç±ã«ããã useRef
ã®ã¿ã€ããå€æŽããŠããŸããïŒãã ãã createRef
ã¯ãŸã æ€èšäžã§ãïŒãããã®çç±ã«ã€ããŠè³ªåããããŸããïŒ
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31065#issuecomment -457650501ã§ã«ããŒãããŠããã¢ã€ãã ã«ã€ããŠãå¥ã®åé¡ãæèµ·ããå¿ èŠããããŸããïŒ
ã¯ããåããŸãããã
nullå€ã§å§ãŸãå¯å€refãªããžã§ã¯ããå¿ èŠãªå Žåã¯ããžã§ããªãã¯åŒæ°ã«ã
| null
ãæå®ããŠãã ããã Reactã§ã¯ãªããææãããŠãããããå€æŽå¯èœã«ãªããŸãã
ãããããããšãïŒ useRef
ãžã§ããªãã¯ã«nullãè¿œå ãããšãåé¡ã解決ããŸããã
å
const ref = useRef<SomeType>(null)
// Later error: Cannot assign to 'current' because it is a constant or a read-only property.
åŸ
const ref = useRef<SomeType | null>(null)
forwardRefã³ã³ããŒãã³ãã«é¢ããå¥ã®ã³ã¡ã³ããäœæãããŸãããïŒ åºæ¬çã«ãåç §ã転éããŠçŸåšã®å€ãçŽæ¥å€æŽããããšã¯ã§ããŸãããããã¯ãåç §ã転éãããã€ã³ãã®äžéšã ãšæããŸãã
次ã®ããã¯ãäœæããŸããã
export const useCombinedRefs = <T>(...refs: Ref<T>[]) =>
useCallback(
(element: T) =>
refs.forEach(ref => {
if (!ref) {
return;
}
if (typeof ref === 'function') {
ref(element);
} else {
ref.current = element; // this line produces error
}
}),
refs,
);
ãããŠããèªã¿åãå°çšã®ããããã£ã§ããããããcurrentãã«å²ãåœãŠãããšãã§ããŸããããšãããšã©ãŒã衚瀺ãããŸãã
current
ãæžã蟌ã¿å¯èœã«å€æŽããã«ããã解決ããæ¹æ³ã¯ãããŸããïŒ
ãã®ããã«ã¯ãããŸããå¿ èŠããããŸãã
(ref.current as React.MutableRefObject<T> ).current = element;
ã¯ããããã¯å°ãäžå¥å šã§ããããã®çš®ã®å²ãåœãŠãå¶ç¶ã§ã¯ãªãæå³çãªãã®ã§ãããšç§ãèããããšãã§ããå¯äžã®ã±ãŒã¹ã§ã-ããªãã¯Reactã®å éšåäœãè€è£œããŠããã®ã§ãã«ãŒã«ãç Žããªããã°ãªããŸããã
createRef
ãå€æŽããŠåããªãŒããŒããŒãããžãã¯ã䜿çšããããšãã§ããŸãããåŒæ°ããªããããæ¡ä»¶ä»ãã®åãè¿ãå¿ èŠããããŸãã| null
ãå«ãããšã$ïŒMutableRefObject
ãè¿ãããŸããå«ããªãå Žåã¯ãïŒäžå€ïŒRefObject
ãªããŸãã
ã©ããããããšã
(ref.current as React.MutableRefObject<T>).current = element;
ããå¿ èŠããããŸãïŒ
(ref as React.MutableRefObject<T>).current = element;
Reactã®å éšåäœãè€è£œããŠããŸã
ããã¯ãããã®ããã¥ã¡ã³ããå€ããªã£ãŠããããšãæå³ããŸããïŒ ããã¯ãå éšã®åäœã§ã¯ãªããæå³ãããã¯ãŒã¯ãããŒãšããŠæ確ã«èª¬æãããŠããããã§ãã
ãã®å Žåã®ããã¥ã¡ã³ãã¯ãææããŠããåç
§ãåç
§ããŠããŸãããHTMLèŠçŽ ã«ref
å±æ§ãšããŠæž¡ãåç
§ã®å Žåã¯ãèªã¿åãå°çšã§ããå¿
èŠããããŸãã
function Component() {
// same API, different type semantics
const countRef = useRef<number>(0); // not readonly
const divRef = useRef<HTMLElement>(null); // readonly
return <button ref={divRef} onClick={() => countRef.current++}>Click me</button>
}
ç§ã®æªããããã«äžã«ã¹ã¯ããŒã«ããå¿
èŠããããŸãã ç§ãææããŠããåç
§ã«å¯ŸããŠreadonly
ã«é¢ãããšã©ãŒãçºçãããããåãã±ãŒã¹ã§ãããšæ³å®ããŸããã ïŒçŸåšãå¥ã®ã¯ãŒã¯ãããŒã䜿çšããŠãããæ®å¿µãªãããšã©ãŒãåçŸã§ããŸãã...ïŒ
ãšã«ããã説æããããšãããããŸãïŒ
ãããã¯ã®createRef
ã®éšåã移åãããã©ããã¯ããããŸããããããã«ãæçš¿ããŸãã
ç§ã¯ReactNativeïŒReact NavigationïŒçšã®äººæ°ã®ããããã²ãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããŠããŸãã ãã®ããã¥ã¡ã³ãã§ã¯ãéåžžã createRef
ãåŒã³åºããŠãããåç
§ãå€æŽããŸãã ããã¯ãReactããããã管çããŠããªãããã ãšç¢ºä¿¡ããŠããŸãïŒDOMã¯ãããŸããïŒã
React Nativeã®ã¿ã€ãã¯ç°ãªãå¿ èŠããããŸããïŒ
åç §ïŒ https ïŒ//reactnavigation.org/docs/navigating-without-navigation-prop
@sylvanaar
ããã²ãŒã·ã§ã³ãåæåãããšãã«ããã®åé¡ã«çŽé¢ããŸãããã解決çãèŠã€ããŸãããïŒ
ç§ãä»èªãã ããšãèŠçŽãããšïŒ createRef<T>
ã«ãã£ãŠäœæãããrefã«å€ãèšå®ããå¯äžã®æ¹æ³ã¯ãããã䜿çšãããã³ã«ããããã£ã¹ãããããšã§ããïŒ ãã®èåŸã«ããçç±ã¯äœã§ããïŒ ãã®å Žåã readonly
ã¯ãrefãžã®å€ã®èšå®ãå®è³ªçã«åŠšããŠãããããé¢æ°ã®ç®çå
šäœãç¡å¹ã«ãªããŸãã
TLDRïŒåæå€ãnull
ïŒè©³çŽ°ïŒãŸãã¯åãã©ã¡ãŒã¿ãŒä»¥å€ã®ãã®ïŒã®å Žåãåãã©ã¡ãŒã¿ãŒã«| null
ãè¿œå ãããšã .current
ãå¯èœã«ãªããŸããéåžžã®ããã«å²ãåœãŠãããŸãã
æãåèã«ãªãã³ã¡ã³ã
ããã§ã¯ãããŸããã åçµãããŠããªãå Žåã§ããæ£ãã䜿çšæ³ãä¿èšŒããããã«æå³çã«èªã¿åãå°çšã®ãŸãŸã«ããŠãããŸãã nullãå²ãåœãŠãããšãã§ããããã«ããããšãæ確ã«ç€ºããã«nullã§åæåãããåç §ã¯ãReactã«ãã£ãŠç®¡çãããåç §ãšããŠè§£éãããŸããã€ãŸããReactã¯çŸåšããææããã衚瀺ããŠããã ãã§ãã
nullå€ã§å§ãŸãå¯å€refãªããžã§ã¯ããå¿ èŠãªå Žåã¯ããžã§ããªãã¯åŒæ°ã«ã
| null
ãæå®ããŠãã ããã Reactã§ã¯ãªããææãããŠãããããå€æŽå¯èœã«ãªããŸããç§ã¯ä»¥åã«ãã€ã³ã¿ããŒã¹ã®èšèªãé »ç¹ã«äœ¿çšããããšããããæææš©ã¯ãããã®èšèªã§_éåžžã«_éèŠã§ãããããããããããã¯ç§ã«ãšã£ãŠç解ãããããã®ã§ãã ãããŠããããrefãšã¯äœãããã€ã³ã¿ãŒã§ãã
.current
ã¯ãã€ã³ã¿ãéåç §ããŠããŸãã