์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ํผ์ ๊ณต๋ถํ๋ ๋จธ์ ๋ฌ๋
- ๊นํ์ฌ์ดํธ
- axios์ธ์คํด์ค
- ICT์ธํด์ญ
- ์ปค์คํ
- ํ๋ก ํธ์๋
- ์ปด๊ณต์ ๋ฐฐ
- svg์
- api๊ณตํตํ
- ๋งฅ๋ถ
- ๋ฅ๋ฌ๋
- ์์ด๋์ค๋ณต
- ios
- ํ ์คํธ ์ธํธ
- ๊นํ์๋ฌ
- ICTํ๊ธฐ
- CSS
- react
- ์์
- ICT์ง์
- ์๋ฆฟ์์ ํ
- ์ฒดํฌ๋ฐ์ค์ปค์คํ
- java 11 ์ค์น
- styled-components
- ๋จธ์ ๋ฌ๋
- ์ทํ๊ท๊ฑธ์ด
- M1
- ํผ๊ณต๋จธ์
- ๊ณผ๋์ ํฉ๊ณผ ๊ณผ์์ ํฉ
- XCode
- Today
- Total
Hi-๋๐ High-๋โ๏ธ
[React] RadioButton ์ปค์คํ ํ๊ธฐ with styled-components ๋ณธ๋ฌธ
๊ธฐ์กด Input์์ ์ ๊ณตํ๋ RadioButton์์ ์๋ง ๋ฐ๊พธ๊ณ ์ถ์์ ๋ฟ์ธ๋ฐ, ์๊ฐ๋ณด๋ค ์๋ฃ๋ค์ด ๋ง์ง ์์๋ค. ์ปค์คํ ํ๋ค๋ ๋ด์ฉ์ ์ดํด๋ณด๋ฉด radio ํน์ ์ ๋๊ทธ๋ผ๋ฏธ 2๊ฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ์๋ณด๋ค, ์์ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์์๋ค. ๊ทธ๋์ ๋์ฒ๋ผ ๊ณ ๋ฏผํ๋ ์ฌ๋๋ค์ ์ํด RadioButton ์ปค์คํ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ๋ค!
๋จผ์ , ๋ด๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ๋ชจ์์ ๋ค์๊ณผ ๊ฐ์๋ค.
๊ณ ๋ คํด์ผ ํ ์ ์ ์ ํ๋์์ ๋
1. ๋ด๋ถ์ ๋๊ทธ๋ผ๋ฏธ๊ฐ ์๊ฒจ์ผ ํ๋ฉฐ
2. icon์ ์๊ณผ label์ ์์์ด ๋ฐ๋์ด์ผ ํ๋ค
๋ ๊ฒ์ด๋ค.
๋ค๋ฅธ ๊ฒ๋ณด๋ค ๋๋ css์ ๋ํด ์ ๋ชจ๋ฅด๊ณ ์์ด์, 1๋ฒ์ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ๋์ง ๋ง๋งํ๋ค.
์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ css์ ๋ํด ์๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ฐ์ ์ ํ์ :after
์ ํํ ์์์ ๋ด์ฉ ๋ค์ ์ฝํ ์ธ ๋ฅผ ์์ฑํ๊ฑฐ๋ ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ์ ์ ํ์
์กฐํฉ์ +
์ธ์ ํ์ ์์๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ํด๋น ์์์ ์คํ์ผ์ ์ ์ฉํ ์ ์๋ค
๊ฐ์ ์ ํ์ :checked
input ์์ ์ค์์ ์ฒดํฌ๋ ์ํ์ธ ์์๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ์ ์ ํ์
์์ CSS ์ ํ์๋ค์ ์ฌ์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ฝ๋
RadioButton.js
๋จผ์ , ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import React from 'react';
import { RadioIcon, RadioInput, RadioWrapper } from './style';
const RadioButton = ({ name, value, checked, onChange, children }) => {
return (
<RadioWrapper checked={checked}>
<RadioInput
type="radio"
name={name}
value={value}
checked={checked}
onChange={onChange}
/>
<RadioIcon checked={checked}/>
{children}
</RadioWrapper>
);
};
export default RadioButton;
style.js
CSS๋ ๋ฐ๋ก ํ์ผ์ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋๋ก ํ์๋ค.
import styled from 'styled-components';
export const RadioWrapper = styled.label`
display: inline-block;
margin-right: 10px;
cursor: pointer;
position: relative;
padding-left: 25px;
font-weight: 700;
color: ${(props) => (props.checked ? '#1C1C1CD9' : '#1C1C1C99')};
`;
export const RadioInput = styled.input`
position: absolute;
opacity: 0;
cursor: pointer;
&:checked + span:after {
display: block;
}
`;
export const RadioIcon = styled.span`
position: absolute;
top: 0;
left: 0;
height: 16px;
width: 16px;
border-radius: 50%;
border: 1.5px solid ${props => props.checked ? '#3D4371' : '#3D437199'};
background-color: #fff;
&:after {
content: '';
position: absolute;
display: none;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #3D4371;
}
`;
์ฌ์ฉ ๋ฐฉ๋ฒ
์์ RadioButton์ ํตํด ๋ฉด์ ์ ์์ฑํ๋ ๋ถ๋ถ์์ ์ง๋ฌด๋ฅผ ์ ํํ ์ ์๋๋ก ๋ง๋ค์๋ค.
GenerateInterview.js
const GenerateInterview = () => {
const [selectedJobType, setSelectedJobType] = useState("");
const handleJobTypeChange = (event) => {
setSelectedJobType(event.target.value);
};
return (
<>
<RadioButton
name="jobType"
value="ํ๋ก ํธ์๋"
checked={selectedJobType === "ํ๋ก ํธ์๋"}
onChange={handleJobTypeChange}
>
ํ๋ก ํธ์๋
</RadioButton>
<RadioButton
name="jobType"
value="์๋ฒ/๋ฐฑ์๋"
checked={selectedJobType === "์๋ฒ/๋ฐฑ์๋"}
onChange={handleJobTypeChange}
>
์๋ฒ/๋ฐฑ์๋
</RadioButton>
<RadioButton
name="jobType"
value="์น ํ์คํ"
checked={selectedJobType === "์น ํ์คํ"}
onChange={handleJobTypeChange}
>
์น ํ์คํ
</RadioButton>
<RadioButton
name="jobType"
value="iOS"
checked={selectedJobType === "iOS"}
onChange={handleJobTypeChange}
>
iOS
</RadioButton>
</>
);
};
export default GenerateInterview;
์คํ ๊ฒฐ๊ณผ
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Datepicker ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ + ์๊ฐ ์ถ๊ฐ (0) | 2023.07.25 |
---|---|
[React] Toggle Component ๋ง๋ค๊ธฐ (0) | 2023.07.19 |
[React] ์๋ฌ ํด๊ฒฐ - "sh: react-scripts: command not found" (0) | 2023.07.04 |
[React] API ์ค์ ๊ณตํตํ - ํ๊ฒฝ๋ณ์, axios ์ธ์คํด์ค ์ฌ์ฉํ๊ธฐ (0) | 2023.05.08 |
[React] API ์ฐ๋ํ๊ธฐ with axios (0) | 2023.05.08 |