๋ฆฌ์กํธ Hooks
- ๋ฆฌ์กํธ 16.8 ์ด์ ๋ฒ์ ์์๋ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์์ง๋ง, ๋ฆฌ์กํธ 16.8์์ Hooks๋ผ๋ ๊ธฐ๋ฅ์ด ๋์ ๋๋ฉด์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ํ ๊ด๋ฆฌํ ์ ์๊ฒ ๋จ
์ด๋ฒคํธ ์ค์
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;
- ์ด๋ฒคํธ ์ค์ ํด์ค ๋, on์ด๋ฒคํธ์ด๋ฆ={์คํํ๊ณ ์ถ์ํจ์} ํํ๋ก ์ค์
import React from "react";
import Counter from "./Counter";
function App() {
return <Counter />;
}
export default App;
useState
: ์ปดํฌ๋ํธ์์ ๋์ ์ธ ๊ฐ์ ์ํ(state)๋ผ๊ณ ๋ถ๋ฆ, useStateํจ์ ์ด์ฉํด ์ปดํฌ๋ํธ์์ ์ํ ๊ด๋ฆฌ ๊ฐ๋ฅ
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>0</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default Counter;
ํจ์ํ ์ ๋ฐ์ดํธ
import React, { useState } from "react";
function Counter() {
const [number, setNumber] = useState(0);
const onIncrease = () => {
setNumber((prevNumber) => prevNumber + 1);
};
const onDecrease = () => {
setNumber((prevNumber) => prevNumber - 1);
};
return (
<div>
<h1>0</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
export default Counter;
โญ๏ธ ํ์ดํ ํจ์
: ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ์ ์ค ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, function ํค์๋ ๋์ => ๋ฌธ์๋ฅผ ์ฌ์ฉํด์ ํจ์ ๊ตฌํ
const add =(a,b) =>{
return a+b;
};
console.log(add(1,2));
input ์ํ ๊ด๋ฆฌ
e.target์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ DOM์ ๊ฐ๋ฆฌํด
์ด DOM์ value ๊ฐ, ์ฆ e.target.value๋ฅผ ์กฐํํ๋ฉด ํ์ฌ input์ ์ ๋ ฅํ ๊ฐ์ด ๋ฌด์์ธ์ง ์ ์ ์์
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;
- input์ ์ํ ๊ด๋ฆฌ ์, input ํ๊ทธ์ value ๊ฐ๋ ์ค์ ํด์ฃผ๋ ๊ฒ์ด ์ค์ํจ -> ์ํ๊ฐ ๋ฐ๋์์ ๋ input์ ๋ด์ฉ๋ ์ ๋ฐ์ดํธ ๋จ
์ฌ๋ฌ๊ฐ์ input ์ํ ๊ด๋ฆฌ
โธ placeholder: input์ ์์ฑ ์ค ํ๋๋ก, input์ด ๋น์ด์ ธ์์ ๋ input์ ๋ํ ์ค๋ช ์ ๋ณด์ฌ์ค
input์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ๋์์ ๋, ๋จ์ํ useState๋ฅผ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ๊ณ , onChange๋ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด์ ๊ตฌํํ๋ ๋ฐฉ์์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋
input์ name์ ์ค์ ํ๊ณ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ด ๊ฐ์ ์ฐธ์กฐํ๋ ๋ฐฉ์์ด ์ข์, useState์์๋ ๋ฌธ์์ด์ด ์๋ ๊ฐ์ฒด ํํ์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํจ
import React, { useState } from "react";
function InputSample() {
const [inputs, setInputs] = useState({
name: "",
nickname: "",
});
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: "",
});
};
return (
<div>
<input name="name" placeholder="์ด๋ฆ" onChange={onChange} value={name} />
<input
name="nickname"
placeholder="๋๋ค์"
onChange={onChange}
value={nickname}
/>
<button onClick={onReset}>์ด๊ธฐํ</button>
<div>
<b>๊ฐ:</b>
{name} ({nickname})
</div>
</div>
);
}
export default InputSample;
- ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์๋ก์ด ๊ฐ์ฒด์ ๋ณํ๋ฅผ ์ฃผ๊ณ , ์ด๋ฅผ ์ํ๋ก ์ฌ์ฉํด์ฃผ์ด์ผ ํจ(๋ฆฌ์กํธ ์ํ์์ ๊ฐ์ฒด ์์ ํ ๊ฒฝ์ฐ, inputs[name]=value; ์ด๋ ๊ฒ ์ง์ ์์ ํ๋ฉด ์๋จ)
setInputs({
...inputs,
[name]: value
});
- ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ์ด์ผ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ์ํ๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋์์ ๊ฐ์งํ ์ ์๊ณ , ์ด์ ๋ฐ๋ผ ํ์ํ ๋ฆฌ๋ ๋๋ง ์งํ
- ๋ฆฌ์กํธ์์๋ ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ์ด์ผ๋ง ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ ๋๋ก ํ ์ ์์
โญ๏ธ spread๋ฌธ๋ฒ
...๋ฌธ๋ฒ(spread ๋ฌธ๋ฒ): ๊ธฐ์กด์ ๊ฒ์ ๊ฑด๋ค์ด์ง ์๊ณ , ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ฆ(๊ฐ์ฒด์ ๋ด์ฉ์ ๋ชจ๋ ํผ์ณ์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ฌ)
const animals=['๊ฐ','๊ณ ์์ด','์ฐธ์'];
const anotherAnimals=[...animals, '๋น๋๊ธฐ'];
console.log(animals);
console.log(anotherAnimals);
