https://chan4im.tistory.com/190
์์ ๊ณผ์ ์์ react ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋, ๋์ ์ธ ๋ถ๋ถ์ ํ๋๋ ์์๋ค.
์ฆ, ๊ฐ์ด ๋ฐ๋๋ ์ผ์ด ์์์ง๋ง, ์ด๋ฒ์๋ ์ฌ์ฉ์์ interaction์ ๋ฐ๋ฅธ ๋ณํ๊ฐ ํ์ํ ๋, ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋์ง ์์๋ณผ ํ์๊ฐ ์๋ค.
Ex. ๋ฒํผ์ ๋๋ฅด๋ฉด ์ซ์๊ฐ ๋ฐ๋๋ Counter ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด๋ณด์!
Counter.js
import React from 'react';
function Counter() {
return (
<div>
<h1>0</h1>
<button>+1</button>
<button>-1</button>
</div>
);
}
export default Counter;
App.js
import React from 'react';
import Counter from './Counter';
function App() {
return (
<Counter />
);
}
export default App;
๐ ์ด์ , Counter์์ ๋ฒํผ์ด ํด๋ฆญ๋๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด?
→ ํน์ ํจ์๊ฐ ํธ์ถ๋๋๋ก ์ค์ ํด๋ณด์.
์ฌ๊ธฐ์ onIncrease ์ onDecrease ๋ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด button์ onClick ์ผ๋ก ํจ์๋ฅผ ์ฐ๊ฒฐํด์ฃผ์๋ค.
์ฆ, react์์ element์ ์ด๋ฒคํธ ์ค์ ์, ๋ค์์ ํํ๋ก ์ค์ ํ๋ค.
on์ด๋ฒคํธ์ด๋ฆ = {์คํํ๊ณ ์ถ์ ํจ์}
Counter.js
import React from 'react';
function Counter() {
const onIncrease = () => {
console.log('+1')
}
const onDecrease = () => {
console.log('-1');
}
return (
<div>
<h1>0</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default Counter;
cf. =>ํจ์ ์ฐธ๊ณ
- ์ข์ธก์๋ ํจ์์ ํ๋ผ๋ฏธํฐ, ํ์ดํ์ ์ฐ์ธก์๋ ์ฝ๋ ๋ธ๋ก์ด ๋ค์ด์จ๋ค.
(https://learnjs.vlpt.us/basics/05-function.html#%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98)
๐ค ๋์ ์ธ ๊ฐ์ ๋ํ ์ปดํฌ๋ํธ ์ํ๊ด๋ฆฌ, useState..?
Ex. ์๋ ์ฝ๋๋ react ํจํค์ง์์ useState๋ผ๋ ํจ์๋ฅผ ๋ถ๋ฌ์จ๋ค.
์ด๋, Setterํจ์๋ param์์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ์ต์ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
Counter.js import React, { useState } from 'react'; function Counter() { const [number, setNumber] = useState(0); const onIncrease = () => { setNumber(number + 1); } const onDecrease = () => { setNumber(number - 1); } return ( <div> <h1>{number}</h1> <button onClick={onIncrease}>+1</button> <button onClick={onDecrease}>-1</button> </div> ); } export default Counter;
InputSample.js import React from 'react'; function InputSample() { return ( <div> <input /> <button>์ด๊ธฐํ</button> <div> <b>๊ฐ: </b> </div> </div> ); } export default InputSample;โ
App.js import React from 'react'; import InputSample from './InputSample'; function App() { return ( <InputSample /> ); } export default App;โ
์ฌ๊ธฐ์ ๋ํด, input์ ์ ๋ ฅํ๋ ๊ฐ์ด ์๋์ ๋ํ๋๊ณ , ์ด๊ธฐํ๋ฒํผ์ ๋๋ฅด๋ฉด input ๊ฐ์ด ๋น์์ง๋๋ก ๊ตฌํํด๋ณด์.
useState๋ฅผ ์ฌ์ฉ, input์ onChange ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ๋,
์ด๋ฒคํธ์ ๋ฑ๋กํ๋ ํจ์์์๋ ์ด๋ฒคํธ ๊ฐ์ฒด e ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์์ ์ฌ์ฉ ํ ์ ์๊ณ ,
์ด ๊ฐ์ฒด์ e.target ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ DOM ์ธ input DOM ์ ๊ฐ๋ฅดํค๊ฒ ๋๋ค.
์ด DOM ์ value ๊ฐ, ์ฆ e.target.value ๋ฅผ ์กฐํํ๋ฉด ํ์ฌ input ์ ์ ๋ ฅํ ๊ฐ์ด ๋ฌด์์ธ์ง ์ ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ useState๋ฅผ ํตํด ๊ด๋ฆฌํด์ฃผ๋ฉด ๋๋ค.InputSample.js import React, { useState } from 'react'; function InputSample() { const [text, setText] = useState(''); const onChange = (e) => { setText(e.target.value); }; const onReset = () => { setText(''); }; return ( <div> <input onChange={onChange} value={text} /> <button onClick={onReset}>์ด๊ธฐํ</button> <div> <b>๊ฐ: {text}</b> </div> </div> ); } export default InputSample;
๐ค useRef๋ก ํน์ DOM ์ ํํ๊ธฐ
JS์์ ํน์ DOM์ ์ ํํด์ผํ ๋, getElementId, querySelector ๊ฐ์ DOM Selectorํจ์๋ฅผ ์ฌ์ฉํด DOM์ ์ ํํ๋ค.
React์์๋ ๊ฐ๋ DOM์ ์ง์ ์ ํํ๋ ์ํฉ์ด ๋ฐ์ํ๋๋ฐ, ์ด๋ ref๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์ ref์ฌ์ฉ ์, useRef๋ผ๋ Hookํจ์๋ฅผ ์ฌ์ฉํ๋ค.
Ex) ์ด๊ธฐํ ๋ฒํผ ํด๋ฆญ ์, ์ด๋ฆ input์ ํฌ์ปค์ค๊ฐ ์กํ๋ ๊ธฐ๋ฅ ๊ตฌํ
InputSample.js import React, { useState, useRef } from 'react'; function InputSample() { const [inputs, setInputs] = useState({ name: '', nickname: '' }); const nameInput = useRef(); const { name, nickname } = inputs; // ๋น๊ตฌ์กฐํ ํ ๋น์ ํตํด ๊ฐ ์ถ์ถ const onChange = e => { const { value, name } = e.target; // ์ฐ์ e.target ์์ name ๊ณผ value ๋ฅผ ์ถ์ถ setInputs({ ...inputs, // ๊ธฐ์กด์ input ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ค [name]: value // name ํค๋ฅผ ๊ฐ์ง ๊ฐ์ value ๋ก ์ค์ }); }; const onReset = () => { setInputs({ name: '', nickname: '' }); nameInput.current.focus(); }; return ( <div> <input name="name" placeholder="์ด๋ฆ" onChange={onChange} value={name} ref={nameInput} /> <input name="nickname" placeholder="๋๋ค์" onChange={onChange} value={nickname} /> <button onClick={onReset}>์ด๊ธฐํ</button> <div> <b>๊ฐ: </b> {name} ({nickname}) </div> </div> ); } export default InputSample;
useRef() ๋ฅผ ์ฌ์ฉํ์ฌ Ref ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์ด ๊ฐ์ฒด๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ ํํ๊ณ ์ถ์ DOM ์ ref ๊ฐ์ผ๋ก ์ค์ ํด์ฃผ๋ฉด, Ref ๊ฐ์ฒด์ .current ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ DOM ์ ๊ฐ๋ฅดํค๊ฒ ๋๋ค.
'ETC(front,back) > React(HTML, CSS, JS)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
<frontend> {15} </React_part 3. ๋ฐฐ์ด> (0) | 2023.07.11 |
---|---|
<frontend> {14} </React_part 1. Basic> (0) | 2023.07.11 |
<frontend> {13} </JS์ ๊ฐ์ฒด, ๋ฌธ์๊ฐ์ฒด๋ชจ๋ธ(DOM)> (0) | 2023.07.05 |
<frontend> {12} </JS๊ธฐ๋ณธ ๋ฌธ๋ฒ, let๊ณผ const, onclick> (0) | 2023.07.05 |
<frontend> {11} </Javascript ๊ธฐ์ด์ฉ์ด ๋ฐ ์ ์ถ๋ ฅ ๋ฐฉ๋ฒ> (0) | 2023.07.05 |