ref - MoonGyeongHyeon/React_Study GitHub Wiki

React - ref

ref?

ref๋Š” reference๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, DOM ์š”์†Œ์— ์ด๋ฆ„์„ ๋‹ฌ์•„์ค€๋‹ค. HTML์˜ id์™€ ๋น„์Šทํ•˜์ง€๋งŒ, id๋Š” ์ผ๋ฐ˜ DOM ์š”์†Œ์— ํŠน์ • DOM ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, ref๋Š” DOM ์š”์†Œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์™€ ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

ref๋Š” ์•„๋ฌด ๊ณณ์—์„œ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋น„๋ก ref๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๊ฐ€๋” ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์ง€๋งŒ, state์™€ props๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์—์„  ref๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์—์„œ๋งŒ ref๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜์— ์ข‹์€ ๋ฐฉํ–ฅ์ด๋‹ค.

๊ทธ๋Ÿผ ์–ธ์ œ ์‚ฌ์šฉ?

  1. ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๋ Œ๋”๋ง ๋œ DOM์— ์ง์ ‘ ์–ด๋– ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•  ๊ฒฝ์šฐ.
  2. ํฐ ํ”„๋กœ์ ํŠธ์— React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ˜ผ์šฉ).

์‚ฌ์šฉ๋ฒ•

ref๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋ฌธ์ž์—ด Attribute ์‚ฌ์šฉ , ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฌธ์ž์—ด Attribute ์‚ฌ์šฉ

    ์ด ๋ฐฉ๋ฒ•์€ outdated ๋˜์—ˆ์ง€๋งŒ ์ฐธ๊ณ ์šฉ์œผ๋กœ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž.

    class Hello extends React.Component {
        render() {
            return (
              <div> 
                <input ref="myInput">
                </input>
              </div>
            )
        }
      
        componentDidMount() {
          this.refs.myInput.value = "Hi, I used ref to do this";
        }
    }
    
    ReactDOM.render(
      <Hello/>,
      document.getElementById('app')
    );

    render() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ (๋ Œ๋”๋ง ๋  ๋•Œ), input ํƒœ๊ทธ์— ref ๊ฐ’์„ ์„ค์ •ํ•ด์ค€๋‹ค. (ref="refName" ํ˜•์‹)

    ๊ทธ ํ›„, componentDidMount() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์†Œ๋“œ์—์„œ ํ•ด๋‹น ํƒœ๊ทธ(ref ๊ฐ’์„ ํ†ตํ•ด ์ฐธ์กฐ)์˜ value ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ๋งŒ๋“  ref๋Š” this.refs.refName ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

    • (!) ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๋ชจ๋‘ ๋๋‚œ ํ›„์—์•ผ refs๊ฐ€ ์ •์˜๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ Œ๋”๋ง์ด ๋ชจ๋‘ ๋๋‚œ ํ›„์— refs๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋งŒ์•ฝ ๊ทธ ์ „์— ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด refs ์ดํ›„์˜ ๊ฐ’์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‚ฌ์šฉ

    class Hello extends React.Component {
      render() {
      	return (
        	  <div> 
          	    <input ref={ref => this.input = ref}>
                </input>
              </div>
            )
      }
      
      componentDidMount() {
      	this.input.value = "I used ref to do this";
      }
      
    }
    ReactDOM.render(
      <Hello/>,
      document.getElementById('app')
    );

    render() ๋ฉ”์†Œ๋“œ์—์„œ, ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ref๋ฅผ ์„ค์ •ํ–ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ref๋กœ ์‚ฌ์šฉ๋  ์ง€ ์ง์ ‘ ์ •ํ–ˆ๋‹ค.

    ref๋ฅผ ์ด์šฉํ•  ๋• this.refs ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์œ„์—์„œ ์ง€์ •ํ•œ ๊ฐ’(this.input)์„ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ์ œ

class Hello extends React.Component {
    handleClick() {
    	  this.textBox.input.value = "I used ref";
    } 
    
    render() {
  	    return (
    	    <div> 
      	    <TextBox ref={ref=>this.textBox = ref}/>
            <button onClick={this.handleClick.bind(this)}>Click Me</button>
          </div>
        )
  }
}

class TextBox extends React.Component {
    render() {
        return(
        	<input ref={ref => this.input = ref}>
          </input>
        )
    }
}

ReactDOM.render(
  <Hello/>,
  document.getElementById('app')
)

Hello ์ปดํฌ๋„ŒํŠธ ์•ˆ์—๋Š” TextBox ์ปดํฌ๋„ŒํŠธ์™€ button ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•œ๋‹ค. TextBox ์˜ ref๋ฅผ this.textBox ๋กœ ์„ค์ •ํ•ด๋‘” ์ƒํƒœ์ด๋‹ค. TextBox ๋Š” input ํƒœ๊ทธ๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ ํƒœ๊ทธ์˜ ref๋Š” this.input ์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. button ํƒœ๊ทธ๋Š” ํด๋ฆญํ•  ๊ฒฝ์šฐ, this.textBox.input.value ์˜ ๊ฐ’์„ "I used ref" ๋กœ ์„ค์ •ํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค.

์œ„๋Š” ๋‹จ์ˆœํžˆ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ ๊ฒƒ ๋ฟ, ์ €๋Ÿฐ ์‹์˜ ์ข‹์ง€ ๋ชปํ•œ ํ”Œ๋กœ์šฐ๋กœ ์‚ฌ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค.

์‘์šฉ

ref๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

์˜ˆ๋ฅผ ๋“ค์–ด, input๊ณผ button์ด ์žˆ๊ณ  button์„ ๋ˆ„๋ฅด๋ฉด input์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  focusํ•ด์•ผ ํ•  ๋•Œ๋Š” ref๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

class Hello extends React.Component {
    handleClick() {
    	  this.input.value = "";
          this.input.focus();
    } 
    
    render() {
  	return (
    	    <div> 
      	        <input ref={ref=> this.input = ref}/>
                <button onClick={this.handleClick.bind(this)}>Click Me</button>
            </div>
        );        
  }
}


ReactDOM.render(
  <Hello/>,
  document.getElementById('app')
);

Javascript DOM ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ input box์— ํฌ์ปค์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ