ref : Naming DOM object

zenibako.lee
3 min readJan 8, 2020

--

<div id='div1'>division</div>

vanilla javascript에서는
개별 div등 unique한 식별자를 부여하기 위해 id라는 속성을 사용했다.

그러나 react에서는 id라는 속성을 사용하면 문제가 발생할 여지가 있다.

props을 달리 부여하여 생성한 복수의 동일 Component가 한 페이지에 같이 render되는 경우가 이에 해당한다.

그 결과, 동일한 id를 갖는 div들이 render의 결과로 생성되게 되고,
의도하던 unique한 식별&조작을 하지 못하게 된다.

반면 ref는 전역이 아니라, 컴포넌트 내부에서만 작동하기 때문에 unique한 식별 및 조작이 가능하다.

Dom객체에 ref를 부여하는 방법은 두가지가 있다.

<input ref = {(ref)=>{this.input1 = ref}}/>

첫번째는 위와 같이 ref라는 속성을 이용해 콜백함수로 부여할 수 있다.

input1 = React.creatRef();
<input ref = {this.input1}/>

두번째는 콜백함수가 아닌, 생성한 ref를 지정하는 방식이다.

import {useRef} from 'react'
const input1 = useRef(null);
<input ref = {this.input1}/>

세번째는 함수형 컴포넌트에서 hook을 이용한 방법이다.

이후

eventHandler = ()={
this.input1.current.focus()}

노드에 대한 참조에 ref의 ‘current’ 어트리뷰트로

‘마운트된’ 컴포넌트의 인스턴스를 받는다.

그리고 태그 뿐만 아니라,
컴포넌트 단위로도 ref를 부여할 수 있다.

<ComponentA ref={(ref)=>{this.CompoA = ref}} />
<Button onClick={()=>{this.CompoA.scrollDown()}}>
스크롤 아래로
</Button>

버튼에 온클릭 이벤트를 부여할 때,

onclick = {this.CompoA.scrollDown}

형식으로 작성을 하게 되면, 컴포넌트가 최초 렌더링 될 시,

CompoA가 undefined이므로, 오류가 발생한다.

따라서 이미 CompoA가 렌더링 된 시점에 클릭하는 시점에 익명함수내부의 값을 호출하기 때문에 에러를 방지할 수 있다.

! 함수형 컴포넌트에서 ref어트리뷰트를 사용하지 말 것,
왜냐하면 인스턴스를 가지고 있지 않기 때문이다.

컴포넌트끼리 교류할 때, prop이 아닌 ref를 통해 데이터를 주고받지 말 것.
react기본 철학을 거스르게 되어, 구조가 지저분해진다.
필요에 따라 redux 혹은 ContextAPI를 사용하는 방식을 사용…

--

--

zenibako.lee
zenibako.lee

Written by zenibako.lee

backend engineer, JS, Node, AWS

No responses yet