Today, What I learned?
๋ผ๋์ค ๋ฒํผ๊ณผ ์ฒดํฌ๋ฐ์ค์ ์ํ ์ ์ง๋ฅผ ์ํ ๊ณ ๋ฏผ์ ๊ณผ์ ์ ๊ธฐ๋กํด ๋ณธ๋ค!..
๋จ์ํ ๊ฐ์ ๋ฃ์ด state๋ฅผ ๋ณ๊ฒฝํด ์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ์ด์ ์ํ ์ค๋ ์ท์ ์ด์ฉํด์ state๋ฅผ ๋ณ๊ฒฝํ๋ ๋ก์ง์ ์จ๋ณด๊ฒ ๋์ด ์ข์๋ค.
์ฒซ ๋ฒ์งธ ์๋
๋ผ๋์ค ๋ฒํผ
const [isJuniorChecked, setIsJuniorChecked] = useState<boolean>(
user?.isJunior,
);
const [checkedPositions, setCheckedPositions] = useState<string[]>(
user?.positions,
);
๋ผ๋์ค ๋ฒํผ์ ๋ค์ด๊ฐ onChange ์ด๋ฒคํธ.
const handleCheckedRadioChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
setIsJuniorChecked(e.target.id === 'isJunior' ? true : false);
},
[],
);
๊ธฐ์กด ๋ผ๋์ค ๋ฒํผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ํด๋ฆญํ ๋๋ง๋ค state๊ฐ ๋ณ๊ฒฝ๋๋ค.
<>
{juniorFlag ? (
<InfoRadioBoxInput
type="radio"
id={id}
name="isJunior"
defaultValue={value}
defaultChecked
onChange={onChange}
/>
) : (
<InfoRadioBoxInput
type="radio"
id={id}
defaultValue={value}
name="isJunior"
onChange={onChange}
/>
)}
<InfoRadioBoxLabel htmlFor={id}>
<InfocCheckBoxSpan>{value}</InfocCheckBoxSpan>
</InfoRadioBoxLabel>
</>
์ฒดํฌ๋ฐ์ค
์ฒดํฌ๋ฐ์ค ํธ๋ค๋ฌ๋ ํด๋ฆญ ์ฌ๋ถ์ ๋ฐ๋ผ ๊ธฐ์กด ์ํ์ ํฌํจ๋์ด ์์๋ค๋ฉด ๋นผ์ค์ผ ํ๊ณ ์์ผ๋ฉด ๋ฃ์ด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ณต์กํ๋ค.
์ด์ state์ ์ค๋
์ท์ ๊ฐ์ ธ์์ ํํฐ๋งํด์ฃผ๋ ๋ฐฉ์์ด๋ค. ์ธํ ํ๊ทธ์ onChange
์ด๋ฒคํธ ๊ฑธ์ด์ฃผ๋ ๋ฐฉ์์ ๋์ผํ๋ค.
const handleCheckedPositionsChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
const { value, checked } = e.target;
if (checked) {
setCheckedPositions((prev) => [...prev, value]);
} else {
// ์ฒดํฌ ํด์ ๋ ๊ฐ ํํฐ๋งํ๊ธฐ
setCheckedPositions((prev) =>
prev.filter((position) => position !== value),
);
}
},
[],
);
์ผ๋จ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ์ด๋ ๊ฒ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ์ด๋ฌ๊ณ ๋ณด๋ ... ๐
๋ง์ดํ์ด์ง ์์์ ๊ด๋ฆฌํด์ผ ํ๋ state ๊ฐ์๊ฐ ๋๋ฌด ๋์ด๋๋ค๋ ๋จ์ ์ด ์์๋ค.
ํ์ฌ ๋ง์ดํ์ด์ง์์๋ ๋๋ค์, ํ๋กํ, ๊ฒฝ๋ ฅ ๋ฑ๋ฑ 5๊ฐ ์ด์์ ์ ์ ์ ๋ณด State๊ฐ ์๋๋ฐ!...
๊ทธ๋์ ์ํ๋ฅผ ํ๋๋ก ๊ด๋ฆฌํด ๋ณด๊ธฐ๋ก ํ๋ค.
๋ ๋ฒ์งธ
userInfo
๋ผ๋ ์ ์ฒด state๋ฅผ ํ๋ ๋ง๋ค์ด ์ฃผ์๋ค.
const [userInfo, setUserInfo] = useState<UserInfo>(initialUserInfo);
์ด state๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์๋์ ๊ฐ์ ๊ฐ๋ค์ ๊ฐ์ง๋ค.
const initialUserInfo = {
displayName: '',
photoURL: '',
isJunior: false,
positions: [],
plannerStack: [],
designerStack: [],
developerStack: [],
};
๋ผ๋์ค ๋ฒํผ
๋ผ๋์ค ๋ฒํผ ์ํ ํธ๋ค๋ฌ๋ ์ด์ ๊ณผ ๋น์ทํ๋ค.
์ด ์ ์ state ์ค๋
์ท์ ๊ฐ์ ธ์ค๊ณ , ๋ผ๋์ค ๋ฒํผ์ ํด๋นํ๋ ํค๊ฐ๋ง ๋ฐ๋ก ์์ ํด ์ค๋ค.
const handleCheckedRadioChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
const { id } = e.currentTarget;
setUserInfo((prevState) => {
return {
...prevState,
isJunior: id === 'junior' ? true : false,
};
});
handleButtonActive();
},
[],
);
์ฒดํฌ ๋ฐ์ค
์ฒดํฌ๋ฐ์ค๋ ๊ฑฐ์ ๋น์ทํ๊ฒ, ์ด์ ์ํ ์ค๋ ์ท์ ๊ฐ์ ธ์ค๊ณ ํด๋น ํค๊ฐ์ ์ฝ ์ง์ด์ ์ํ๋ฅผ ๋ณ๊ฒฝํด ์ค๋ค.
const handleCheckedPositionsChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
handleButtonActive();
const { value, checked } = e.target;
if (checked) {
setUserInfo((prevState) => {
return {
...prevState,
positions: [...prevState.positions, value],
};
});
} else {
// ์ฒดํฌ ํด์ ๋ ๊ฐ ํํฐ๋งํ๊ธฐ
setUserInfo((prevState) => {
return {
...prevState,
positions: prevState.positions.filter(
(position) => position !== value,
),
};
});
}
},
[],
);
์ด ์ธ์ ๊ธฐ์ ์คํ ์ ํ ๋ถ๋ถ์ ์์ด์ ๋ํญ์ ๊ฒช๊ณ ์๊ธด ํ์ง๋ง.. ๐
์ด๊ฑด ์ถํ์ ๊ธ์ ์์ฑํด ๋ณด์์ผ๊ฒ ๋ค.
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ํ๋ก์ ํธ ๋ฆฌ์คํธ ํํฐ๋ง ์ฌ์ (1) - Promise.all (0) | 2023.02.16 |
---|---|
[React] ์ปค์คํ ๋ชจ๋ฌ ๋ง๋ค๊ธฐ (0) | 2023.02.15 |
[Project Detto] ๊ธฐ์ ์คํ ์ค๋ณต ์ฒ๋ฆฌ์ ๋ํ ๊ณ ์ฐฐ (0) | 2023.02.10 |
[React] input radio, checkbox ์ปค์คํ ํ๊ธฐ with Styled-components (3) | 2023.02.08 |
Yarn Berry ์ค์ (0) | 2023.02.07 |
Comment