https://chan4im.tistory.com/190
<frontend> {14} </React_part 1>
๐ค React ๋ผ์ด๋ธ๋ฌ๋ฆฌ...? JS๋ฅผ ์ฌ์ฉํด HTML๋ก ๊ตฌ์ฑ๋ UI๋ฅผ ์ ์ดํ๋ค๋ฉด, DOM ๋ณํ์ ์ํด ์๋์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ฅธ๋ค. 1. Selector API๋ฅผ ์ฌ์ฉํด ํน์ DOM์ ์ ํ 2. ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์, ๋ณํ๋ฅผ ์ฃผ๋๋ก ์ค
chan4im.tistory.com
์์ ๊ณผ์ ์์ 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)
05. ํจ์ · GitBook
ํจ์๋, ํน์ ์ฝ๋๋ฅผ ํ๋์ ๋ช ๋ น์ผ๋ก ์คํ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์๋ฅผ ๋ค์ด์, ์ฐ๋ฆฌ๊ฐ ํน์ ๊ฐ๋ค์ ํฉ์ ๊ตฌํ๊ณ ์ถ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ํ๋ฒ, ์ด ์์ ์ ํจ์๋ก ๋ง
learnjs.vlpt.us
๐ค ๋์ ์ธ ๊ฐ์ ๋ํ ์ปดํฌ๋ํธ ์ํ๊ด๋ฆฌ, 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 |