[ ํ์ ์คํฌ๋ฆฝํธ(TypeScript) ] 2๊ฐ ์ด์์ ๋์ผํ ๊ธฐ๋ฅ์ธ useState์ handleChange๋ฅผ ๊ฐ๊ฐ ํ๋๋ก ๊ด๋ฆฌํ๊ธฐ
๐ 2๊ฐ ์ด์์ ๋์ผํ ๊ธฐ๋ฅ์ธ useState์ handleChange๋ฅผ ๊ฐ๊ฐ ํ๋๋ก ๊ด๋ฆฌํ๊ธฐ
๊ตฌ๋
์ ์ฒญ ํ์ด์ง๋ฅผ ๋ง๋ค๋ฉด์ ๊ฐ์ธ์ ๋ณด์์ง checkbox์ ๊ด๊ณ ์ฑ ์ ๋ณด ์์ input checkbox
๋ฅผ useState
๋ก ๊ด๋ฆฌํ๋ ค๊ณ ํ๋๋ฐ, ์ฌ๋ฌ ๊ฐ์ useState
๋ก ์ ์ธํ์ฌ ๊ด๋ฆฌํ๋๊น ์ฝ๋๊ฐ ๋ถํ์ํ๊ฒ ๊ธธ์ด์ ธ ์ข์ ์ฝ๋๋ผ๊ณ ๋ณด๊ธฐ ํ๋ค์๋ค. ๊ทธ๋์ ๊ธฐ์กด์ const [state, setState] = useState(false)
์ฒ๋ผ ์ ์ธํ๋ค๋ฉด ์ด๋ฅผ object
๋ก ๋ฌถ์ด ์ ์ธํ๋ ์ฝ๋๊ฐ ์ค์ด๋ค์๋ค.
import { useState } from "react";
// ๋ฆฌํฉํ ๋ง ์
export default function Subscription() {
const [allAgree, setAllAgree] = useState<boolean>(false);
const [privateAgree, setPrivateAgree] = useState<boolean>(false);
const [adAgree, setAdAgree] = useState<boolean>(false);
}
// ๋ฆฌํฉํ ๋ง ํ
interface AgreeType {
personalInfo: boolean;
adInfo: boolean;
}
export default function Subscription() {
const [{ personalInfo, adInfo }, setAgree] = useState<AgreeType>({
personalInfo: false,
adInfo: false,
});
}
๋ํ, checkbox
์ state
๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด setAgree
์ ๊ฐ์ ๋ณ๊ฒฝํด์ผํ๋๋ฐ, ๋ฆฌํฉํฐ๋ง ์ ์๋ allAgree
๋ง์ ์ํ allHandleChange
๋ฅผ ๋ง๋ค์๊ณ , ๋๋จธ์ง privateAgree
, adAgree
๋ฅผ ์ํ handleChange
ํจ์๋ฅผ ๋ง๋ค์๋๋ฐ, ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ์๋ช
๋ง ๋ค๋ฅผ ๋ฟ ๋์ผํ ์ญํ ์ ํ๋๋ฐ๋ ํจ์๋ฅผ 2๊ฐ ์ด์ ๊ด๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋
์ฑ์ด ๋งค์ฐ ์ข์ง ์์๊ณ ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ํจ์ 1๊ฐ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด input
์ id
๊ฐ์ผ๋ก ์กฐ๊ฑด์ ๊ตฌ๋ถํ์ฌ check
๋ฅผ toggle
ํ ์ ์๊ฒ ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ฒด ๋์ํฉ๋๋ค
๊ธฐ๋ฅ์ ํด๋น input
์ checked
property์ personalInfo
, adInfo
๊ฐ ์ฐธ์ผ ๋๋ง checked
๊ฐ ๋ ์ ์๊ฒ ์ค์ ํ๋ค. ์ด๋ ๊ฐ๋
์ฑ์ ์ํด ๋ชจ๋ ๋์ ํ์ ๋์ ์กฐ๊ฑด์ const checkedAllInfo = personalInfo && adInfo
๋ณ์๋ก ๊ด๋ฆฌํ๋ค. ์ฌ๋ด์ผ๋ก ํ๋จ ์ฝ๋๋ธ๋ญ์ 92๋ฒ ๋ผ์ธ์ else
๋ก ์ฒ๋ฆฌ ํ ์ ์์ง ์๋๊ฐ๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, 67๋ฒ ๋ผ์ธ์ AgreeType
ํ์
์ ์ ์ํด๋์๊ธฐ ๋๋ฌธ์ else
์กฐ๊ฑด์ personalInfo
ํน์ adInfo
์ธ์ ๋ค๋ฅธ id
๊ฐ ์จ๋ค๋ฉด ํ์
์คํฌ๋ฆฝํธ์์ ์ ๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ๋ง์ฝ, else
๋ฅผ ๋ฃ๊ณ ์ถ๋ค๋ฉด 7๋ฒ๋ผ์ธ์ AgreeType
์ [key: string]: boolean
์ ๋ฃ์ด ๋ค๋ฅธ id
๊ฐ ์ค๋๋ผ๋ ๊ทธ id
๊ฐ boolean
ํ์
์ด๋ผ๊ณ ์ ์ํ๋ฉด ๋๋ค.
import { useState } from "react";
// ๋ฆฌํฉํ ๋ง ์
export default function Subscription() {
const [allAgree, setAllAgree] = useState<boolean>(false);
const [privateAgree, setPrivateAgree] = useState<boolean>(false);
const [adAgree, setAdAgree] = useState<boolean>(false);
const allHandleChange = () => {
if (allAgree) {
setAllAgree(false);
setPrivateAgree(false);
setAdAgree(false);
} else {
setAllAgree(true);
setPrivateAgree(true);
setAdAgree(true);
}
};
const handleChange = (
setState: React.Dispatch<React.SetStateAction<boolean>>
) => {
setState((state) => !state);
};
return (
<>
<Section centered margin={{ top: 60 }}>
<label htmlFor="agree-all">
<input
id="agree-all"
type="checkbox"
checked={allAgree}
onChange={allHandleChange}
/>
์ ์ฒด ๋์ํฉ๋๋ค.
</label>
<label htmlFor="agree-private">
<input
id="agree-private"
type="checkbox"
checked={privateAgree}
onChange={() => handleChange(setPrivateAgree)}
/>
๊ฐ์ธ์ ๋ณด ์์ง ๋ฐ ์ด์ฉ์ ๋์ํฉ๋๋ค. (ํ์)
</label>
<label htmlFor="agree-advertise">
<input
id="agree-advertise"
type="checkbox"
checked={adAgree}
onChange={() => handleChange(setAdAgree)}
/>
๊ด๊ณ ์ฑ ์ ๋ณด ์์ ์ ๋์ํฉ๋๋ค. (ํ์)
</label>
<Button disabled={!(privateAgree && adAgree)}>๊ตฌ๋
ํ๊ธฐ</Button>
</Section>
</>
);
}
// ๋ฆฌํฉํ ๋ง ํ
// #1
interface AgreeType {
[key: string]: boolean
}
// #2
interface AgreeType {
personalInfo: boolean;
adInfo: boolean;
}
export default function Subscription() {
const [{ personalInfo, adInfo }, setAgree] = useState<AgreeType>({
personalInfo: false,
adInfo: false,
});
const checkedAllInfo = personalInfo && adInfo;
const handleCheck = (e: { target: HTMLInputElement }) => {
const { id, checked } = e.target
if (id === 'all') {
setAgree(
checked
? {
personalInfo: true,
adInfo: true,
}
: {
personalInfo: false,
adInfo: false,
},
)
} else {
setAgree((prevState) => ({
...prevState,
[id]: !prevState[id],
}))
}
}
return (
<>
<Section centered margin={{ top: 60 }}>
<label htmlFor="all">
<input
id="all"
type="checkbox"
checked={personalInfo && adInfo}
onChange={handleChange}
/>
<Text size={17} bold>
์ ์ฒด ๋์ํฉ๋๋ค.
</Text>
</label>
<label htmlFor="personalInfo">
<input
id="personalInfo"
type="checkbox"
checked={personalInfo}
onChange={handleChange}
/>
<Text size="medium">๊ฐ์ธ์ ๋ณด ์์ง ๋ฐ ์ด์ฉ์ ๋์ํฉ๋๋ค. (ํ์)</Text>
</label>
<label htmlFor="adInfo">
<input
id="adInfo"
type="checkbox"
checked={adInfo}
onChange={handleChange}
/>
<Text size="medium">๊ด๊ณ ์ฑ ์ ๋ณด ์์ ์ ๋์ํฉ๋๋ค. (ํ์)</Text>
</label>
<Button disabled={!checkedAllInfo}>๊ตฌ๋
ํ๊ธฐ</Button>
</Section>
</>
);
}