findDOMNode
findDOMNode
๋ React์ ํด๋์ค ์ปดํฌ๋ํธ์์ ๋ธ๋ผ์ฐ์ ์ DOM ๋
ธ๋๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์
๋๋ค.
const domNode = findDOMNode(componentInstance)
๋ ํผ๋ฐ์ค
findDOMNode(componentInstance)
findDOMNode
๋ฅผ ํธ์ถํ์ฌ ์ฃผ์ด์ง ํด๋์ค ์ปดํฌ๋ํธ์์ ๋ธ๋ผ์ฐ์ ์ DOM ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค.
import { findDOMNode } from 'react-dom';
const domNode = findDOMNode(componentInstance);
์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋งค๊ฐ๋ณ์
componentInstance
:์ปดํฌ๋ํธ
ํ์ ํด๋์ค์ ์ธ์คํด์ค์ ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋์ค ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐthis
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ฐํ
findDOMNode
๋ ์ฃผ์ด์ง componentInstance
์์ ๊ฐ์ฅ ์ฒ์ ๋ฑ์ฅํ๋ ๋ธ๋ผ์ฐ์ DOM ๋
ธ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ null
์ด๋ false
๋ฅผ ๋ ๋๋งํ ๊ฒฝ์ฐ findDOMNode
๋ null
์ ๋ฐํํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ฌธ์์ด์ ๋ ๋๋งํ๋ฉด findDOMNode
๋ ๊ทธ ๊ฐ์ ํฌํจํ ํ
์คํธ DOM ๋
ธ๋๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃผ์์ฌํญ
-
์ปดํฌ๋ํธ๊ฐ ๋ฐฐ์ด์ด๋ ๋ค์์ ์์์ ๊ฐ์ง Fragment๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ
findDOMNode
๋ ํด๋นํ๋ DOM ๋ ธ๋ ์ค ๋น์ด์์ง ์์ ์ฒซ ๋ฒ์งธ ์์์ ๋ฐํํฉ๋๋ค. -
findDOMNode
๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์์ ๋(์ฆ, ์ปดํฌ๋ํธ๊ฐ DOM์ ๋ฐฐ์น๋์์ ๋)๋ง ๋์ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์์ง ๋ง์ดํธ ๋์ง ์์ ์ํ์์ ํธ์ถํ ๊ฒฝ์ฐ (์์๋ก ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ธฐ ์ ์ธrender()
๋ด์์findDOMNode()
๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ) ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. -
findDOMNode
๋ ํธ์ถํ ๋น์์ ๊ฒฐ๊ณผ๋ง ๋ฐํํฉ๋๋ค. ์ดํ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ๋ ๋๋งํ๋๋ผ๋, ๊ทธ ๋ณํ์ ๋ํด ์ ์ ์์ต๋๋ค. -
findDOMNode
๋ ํด๋์ค ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ํจ์ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
ํด๋์ค ์ปดํฌ๋ํธ์ root DOM ๋ ธ๋๋ฅผ ์ฐพ๊ธฐ
ํด๋์ค ์ปดํฌ๋ํธ ์ธ์คํด์ค์์ findDOMNode
๋ฅผ ํธ์ถํ์ฌ (์ฃผ๋ก this
) ์ด๋ฅผ ๋ ๋๋งํ DOM ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค.
class AutoselectingInput extends Component {
componentDidMount() {
const input = findDOMNode(this);
input.select()
}
render() {
return <input defaultValue="Hello" />
}
}
์ฌ๊ธฐ์ input
๋ณ์๋ <input>
DOM ์์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค. ์ด์ ์ด๊ฒ์ ํตํด ์์
์ด ๊ฐ๋ฅํด์ง๋๋ค. ์๋ฅผ ๋ค์ด โShow exampleโ์ ํด๋ฆญํ์ฌ ์
๋ ฅ์ฐฝ์ ๋ง์ดํธํ๊ณ , input.select()
๋ก ์
๋ ฅ์ฐฝ์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ ํํ๋๋ก ํฉ๋๋ค.
import { Component } from 'react'; import { findDOMNode } from 'react-dom'; class AutoselectingInput extends Component { componentDidMount() { const input = findDOMNode(this); input.select() } render() { return <input defaultValue="Hello" /> } } export default AutoselectingInput;
๋์
ref๋ฅผ ํตํด ์ปดํฌ๋ํธ์ DOM ๋ ธ๋ ์ฝ๊ธฐ
findDOMNode
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ JSX ๋
ธ๋์ ์ด์ ํด๋นํ๋ ์ฝ๋ ์ฌ์ด์ ์ฐ๊ฒฐ์ด ๋ช
์์ ์ด์ง ์์ ์ทจ์ฝํฉ๋๋ค. ์์๋ก <input />
๋ฅผ <div>
๋ก ๊ฐ์ธ๋ณด์ธ์.
import { Component } from 'react'; import { findDOMNode } from 'react-dom'; class AutoselectingInput extends Component { componentDidMount() { const input = findDOMNode(this); input.select() } render() { return <input defaultValue="Hello" /> } } export default AutoselectingInput;
์ด์ ์ฝ๋๊ฐ ๊นจ์ง ํ
๋ฐ, ์ฝ๋๋ findDOMNode(this)
๊ฐ <input>
DOM ๋
ธ๋๋ฅผ ์ฐพ์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๊ณ ์์์ง๋ง ์ค์ ๋ก ์ฐพ์ ๊ฒ์ <div>
DOM ๋
ธ๋์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํน์ DOM ๋
ธ๋๋ฅผ ๊ด๋ฆฌํ ๋๋ createRef
๋ฅผ ์ฌ์ฉํ์ธ์.
์ด ์์์์ findDOMNode
๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋์ inputRef = createRef(null)
๋ฅผ ํด๋์ค์ ์ธ์คํด์ค ํ๋์ ์ ์ํ์์ต๋๋ค. ์ฌ๊ธฐ์ this.inputRef.current
๋ฅผ ํตํด DOM ๋
ธ๋๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ JSX์ ๋ถ์ด๋ ค๋ฉด, <input ref={this.inputRef} />
๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ด ์์
์ DOM ๋
ธ๋๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ JSX๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
import { createRef, Component } from 'react'; class AutoselectingInput extends Component { inputRef = createRef(null); componentDidMount() { const input = this.inputRef.current; input.select() } render() { return ( <input ref={this.inputRef} defaultValue="Hello" /> ); } } export default AutoselectingInput;
ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ต์ React์์๋, useRef
๋ฅผ ๋์ ํธ์ถํ์ฌ ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค.
import { useRef, useEffect } from 'react'; export default function AutoselectingInput() { const inputRef = useRef(null); useEffect(() => { const input = inputRef.current; input.select(); }, []); return <input ref={inputRef} defaultValue="Hello" /> }
refs๋ฅผ ์ฌ์ฉํ DOM ์กฐ์์ ๋ํด ๋ ์์๋ณด์ธ์.
forwarded ref๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ์ DOM ๋ ธ๋๋ฅผ ์ฝ๊ธฐ
์ด ์์์์๋ findDOMNode(this)
๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํ DOM ๋
ธ๋๋ฅผ ์ฐพ์ต๋๋ค. AutoselectingInput
์ปดํฌ๋ํธ๋ ๋ธ๋ผ์ฐ์ ์ <input>
์ ๋ ๋๋งํ๋ MyInput
์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
import { Component } from 'react'; import { findDOMNode } from 'react-dom'; import MyInput from './MyInput.js'; class AutoselectingInput extends Component { componentDidMount() { const input = findDOMNode(this); input.select() } render() { return <MyInput />; } } export default AutoselectingInput;
AutoselectingInput
์ปดํฌ๋ํธ์ ๋ด๋ถ์์ findDOMNode(this)
๋ฅผ ํธ์ถํ๋ฉด, <input>
์ ๋ํ JSX๊ฐ MyInput
์ปดํฌ๋ํธ ๋ด๋ถ์ ์จ๊ฒจ์ ธ ์๋๋ผ๋ ๋ฌธ์ ์์ด <input>
DOM ๋
ธ๋๋ฅผ ์ฐพ์๋ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋์์ด ์ ์์์์๋ ํธ๋ฆฌํด ๋ณด์ผ ์ ์๊ฒ ์ง๋ง, ๊ฒฐ๊ตญ์ ์ทจ์ฝํ ์ฝ๋๋ก ๊ฐ๋ ๋ฐ๊ฑฐ๋ฆ์ด ๋ฉ๋๋ค. ๋ง์ฝ ๋์ค์ ์ฝ๋๋ฅผ ์์ ํ๋ฉฐ MyInput
์ <div>
๋ก ๊ฐ์ผ๋ค๊ณ ์๊ฐํด ๋ณด์ธ์. <input>
์ ์ฐพ์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ AutoselectingInput
์ ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์ ์์์ findDOMNode
๋ฅผ ๋์ฒดํ๋ ค๋ฉด, ๋ ์ปดํฌ๋ํธ๊ฐ ํ๋ ฅํด์ผ ํฉ๋๋ค.
AutoSelectingInput
์์๋ ref๋ฅผ ์ ์ธํด์ผ ํ๊ณ , ์ด์ ์ ์์์ฒ๋ผ<MyInput>
์ผ๋ก ์ ๋ฌํฉ๋๋ค.MyInput
์forwardRef
๋ก ์ ์ธํด์ผ ํ๋ฉฐ, ํด๋น ref๋ฅผ ๊ฐ์ ธ์<input>
๋ ธ๋๋ก ์ ๋ฌํฉ๋๋ค.
์๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ ์ด์ findDOMNode
๊ฐ ํ์ํ์ง ์์ต๋๋ค.
import { createRef, Component } from 'react'; import MyInput from './MyInput.js'; class AutoselectingInput extends Component { inputRef = createRef(null); componentDidMount() { const input = this.inputRef.current; input.select() } render() { return ( <MyInput ref={this.inputRef} /> ); } } export default AutoselectingInput;
ํด๋์ค ์ปดํฌ๋ํธ ๋์ ํจ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ๋๋ ์ด๋ฐ ์ฝ๋๋ก ๋์ํฉ๋๋ค.
import { useRef, useEffect } from 'react'; import MyInput from './MyInput.js'; export default function AutoselectingInput() { const inputRef = useRef(null); useEffect(() => { const input = inputRef.current; input.select(); }, []); return <MyInput ref={inputRef} defaultValue="Hello" /> }
๊ฐ์ธ์ฃผ๋ <div>
์์ ์ถ๊ฐํ๊ธฐ
์ปดํฌ๋ํธ๋ ์ข
์ข
์์์ ์์น์ ํฌ๊ธฐ๋ฅผ ์์์ผ ํ ๋๊ฐ ์์ต๋๋ค. ๋๋ฌธ์ findDOMNode(this)
๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ค์ ์ฐพ๊ณ , ์ธก์ ์ ์ํด getBoundingClientRect
์ ๊ฐ์ DOM ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก์ ์ง์ ์ ์ผ๋ก ๋์๋๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ findDOMNode
๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์๋ React์์ ์์ ํ ์ฌ๋ผ์ง์ง๋ ์์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฝํ
์ธ ์ฃผ์๋ฅผ <div>
๋
ธ๋๋ก ๊ฐ์ธ์ฃผ๊ณ , ๊ทธ ๋
ธ๋์ ref๋ฅผ ๊ฐ์ ธ์์ต๋๋ค. ํ์ง๋ง, ์ฝํ
์ธ ๋ฅผ ๊ฐ์ธ๋ ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์คํ์ผ์ ์์ํ ์ ์์ต๋๋ค.
<div ref={someRef}>
{children}
</div>
์ด๋ ํน์ ํญ๋ชฉ์ ์ด์ ์ ๋ง์ถ๊ณ ์คํฌ๋กค์ ํ๋ ๊ฒฝ์ฐ์๋ ์ ์ฉ๋ฉ๋๋ค.