์๋ก
์ฌ๋ด UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Mui๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ ๋์์ธ ์์คํ ์ ๋ฐ๋ฅธ ์ปดํฌ๋ํธ ์คํ์ผ๋ง ์์ ์ theme ์์ฒด๋ฅผ ์ปค์คํ ํ์ฌ ์ฌ์ฉ์ค์ด๋ค. theme์ ์ปค์คํฐ๋ง์ด์ฆํด์ ํจํค์ง๋ก ๋ถ๋ฆฌํ์ฌ ํจํค์ง์์ ์ ์ํด๋ theme์ ๊ฐ์ ธ์ค๋ฉด ์ด๋ ์ํฌ์คํ์ด์ค ํ๋ก์ ํธ์์๋ ๋์์ธ์ด ํ๋ฒ์ ์ ์ฉ๋๊ฒ ํ์ฌ ์ ์ง๋ณด์๋ฅผ ํ๊ณ ์๋ค. ์ฆ theme์ ๋์์ธ ์์ ์ ํด๋๋ฉด ๋ ํฌ ๋ด๋ถ์ ๋ชจ๋ ์ํฌ์คํ์ด์ค์์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๋ ์คํ์ผ๋ง์ด ์ ํ์ง ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๊ฐ์ ธ๋ค๊ฐ ์ธ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฒ์ Select ์ปดํฌ๋ํธ๋ฅผ ์ปค์คํ ํ๋๋ฐ ๋๋ ์ฝ์ง์ ํ์๋ค...
๋ผ๋ฒจ ์ฌ๋ถ์ ๋ฐ๋ผ padding ๊ฐ๊ฒฉ์ ์กฐ์ ํด์ผํ๋๋ฐ, Textfield ์ปดํฌ๋ํธ์๋ ๋ค๋ฅด๊ฒ ์ง์ ์ ์ผ๋ก label ํ๋กํผํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ด ์ ๋ฅผ ๋จน์๋ค. ๊ทธ๋์ ๊ธฐ๋กํด๋ด!
Textfield
๋จผ์ Mui์ ํ ์คํธํ๋์ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก `FormControl`, `InputLabel`, `Input`, `FormHelperText` ๋ฑ์ ์ถ์ํ์ํจ ์ปดํฌ๋ํธ์ด๋ค.
Textfield ์ปดํฌ๋ํธ ์ฌ์ฉ
<ThemeProvider theme={theme}>
<TextField
label='Label'
value={textfieldVal}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setTextfieldVal(e.target.value)
}
/>
</ThemeProvider>
theme์์ Textfield ์ปค์คํ ํ๊ธฐ
const theme = createTheme({
components: {
MuiTextField: {
root: ({ ownerState }) => ({
...(ownerState.variant === 'filled' && {
'.MuiInputBase-input': {
paddingLeft: '1rem',
...(ownerState.label
? {
paddingTop: '1.5rem',
paddingBottom: '0.5rem',
}
: {
padding: '1rem',
}),
...{
paddingRight: ownerState.InputProps?.endAdornment ? 0 : '1rem',
},
},
}),
}),
},
},
});
https://mui.com/material-ui/customization/theme-components/ ๊ณต์๋ฌธ์ ๋๋ก ๊ธฐ์กด์ ์ ์ฉ๋ ์คํ์ผ๋ง์ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ์๋ก ์คํ์ผ๋ง์ ์ ์ฉ์ํจ๋ค. ํ ์คํธํ๋์ ๊ฒฝ์ฐ `ownerState` prop์ `label`์ด ์กด์ฌํ์ฌ, ๋ผ๋ฒจ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ฐ๋ก ํ๋จํ์ฌ ์ฝ๊ฒ ์คํ์ผ๋งํ ์ ์์๋ค.
ํ ์คํธํ๋ ๋งจ ์ค๋ฅธ์ชฝ์ ๋ฃ๋ ํด๋ฆฌ์ด ๋ฒํผ ์ฌ๋ถ๋ ๋ง์ฐฌ๊ฐ์ง๋ก `InputProps`์ `endAdornment` prop์ผ๋ก ์ฝ๊ฒ ํ๋จ ๊ฐ๋ฅํ์ฌ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
Select
Select ์ปดํฌ๋ํธ ์ฌ์ฉ
<ThemeProvider theme={theme}>
<FormControl>
<InputLabel>Label</InputLabel> //<- ๋ผ๋ฒจ ๋ฃ๋ ์ฝ๋. ์ ๊ฑฐํ๋ฉด ๋ผ๋ฒจ ์์
<Select
value={selectVal}
onChange={(event) => setSelectVal(event.target.value)}
variant="filled"
>
<MenuItem value={1}>1</MenuItem>
<MenuItem value={2}>2</MenuItem>
<MenuItem value={3}>3</MenuItem>
</Select>
</FormControl>
</ThemeProvider>
theme์์ Select ์ปค์คํ ํ๊ธฐ
Select๋ ์์ Textfield์ ๋น์ทํ๊ฒ `root` slot์ ๊ฐ์ง๊ณ ์ปค์คํ ๊ฐ๋ฅํ๊ฒ ๊ฑฐ๋ ํ๋๋ฐ, select ์์ styleOverrides ๊ฐ๋ฅํ slot์๋ root๊ฐ ์์๋ค.
MuiSelect๋ฅผ ํ๊ณ ๊ฐ์ ํ์ ์ ์ด์ด๋ณด๋ ์์ ํด๋์ค์ ํด๋นํ๋ ์ ๋ค๋ง ์คํ์ผ๋ง ์ค๋ฒ๋ผ์ด๋ฉ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ownerState prop์ผ๋ก label์ ๊ฐ์ ธ์ฌ ์๋ ์์๋ค.
๋ฐ๋ผ์ ๊ฒฐ๊ตญ์ Select ๋ฅผ ์ฌ์ฉํ ๋ ์์์ ๊ฐ์ธ๋ FormControl์ ์ ์ดํด์ผ ํ๋ค.
MuiSelect ๊ตฌ์กฐ ํ์ ํ๊ธฐ
๋ผ๋ฒจ์ด ์๋ ์ ๋ ํธ๋ฅผ ์ฝ์์์ ํ์ธํด๋ณด๋ฉด ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ๋์๋ค.
์์ dom ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ ์ฝ๊ฒ ๊ตฌ์กฐํํ๋ฉด ์๋์ ๊ฐ์ ๊ฒ์ด๋ค.
๋ผ๋ฒจ์ด ์์๋๋ `MuiInputLabel-root` ๋ผ๋ ํด๋์ค ์์๊ฐ ์๋ ๊ฒ์ด๋, ์ฐ์ ๋ผ๋ฒจ์ด ์์๋ ๊ธฐ๋ณธ ํจ๋ฉ๊ฐ์ ์ ์ฉํด์ฃผ๊ณ , ์ ํ์๋ก ๋ผ๋ฒจ์ด ์์๋๋ฅผ ๊ณจ๋ผ ๋ผ๋ฒจ์ด ์๋ ๊ฒฝ์ฐ์ ํจ๋ฉ์ ์ ์ฉํด์ค๋ค.
const theme = createTheme({
components: {
MuiFormControl: {
styleOverrides: {
root: {
'& .MuiInputLabel-root + .MuiInputBase-root': { //์
๋ ํธ ๋ผ๋ฒจ์์๋ ํจ๋ฉ
'.MuiSelect-select': {
paddingTop: '1.5rem',
paddingBottom: '0.5rem',
},
},
'& .MuiSelect-select': { //๋ผ๋ฒจ ์์๋
padding: '1rem',
},
},
},
},
},
});
'& .MuiInputLabel-root + .MuiInputBase-root' ํด์ํ๊ธฐ
์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์์๋๋ฐ, &์ ๋์ด์ฐ๊ธฐ์ ๋ฐ๋ฅธ ์์ ์ ํ์ด๋ค. & ๋ค์ ๋์ด์ฐ๊ธฐ๋ฅผ ๋ถ์ด๋ฉด ๋ญ๊ฐ ๋ค๋ฅผ๊น?
- `&.className:` &์ธ ํ์ฌ ์์์ ์ง์ ์ ์ฉ๋๋ค.
- `& .className:` &์ ์์ ์์๋ฅผ ์ ํํ๋ค.
ํ์ฌ ์ ํํ ๊ธฐ์ค์ด ๋๋ ์ปดํฌ๋ํธ์ธ `MuiFormControl`์์ ์์์์์ธ `MuiInputLabel-root`๋ฅผ ์ ํํ๊ณ , mui์์ Textfield, Input, Select์ ๊ธฐ๋ณธ ๋ฒ ์ด์ค๊ฐ ๋๋ ์ปดํฌ๋ํธ์ธ `MuiInputBase-root` ๋ ์ ํํ์ฌ (์ธ์ ํ ํ์ ์ด๋ฏ๋ก + ๋ก ์ฐ๊ฒฐ) ๋ผ๋ฒจ์ด ์กด์ฌํ๋์ง ํ์ ํ ์๊ฐ ์๊ฒ ๋๋ค.
์ฆ ๋์ผํ ๋ถ๋ชจ ์์ ๋ด์์ `MuiInputLabel-root` ํด๋์ค๋ฅผ ๊ฐ์ง ์์ ๋ฐ๋ก ๋ค์ `MuiInputBase-root` ์์๊ฐ ๋ฐ๋ก ๋ค๋ฐ๋ผ์ค๋ฉด? ๋ผ๋ฒจ์ด ์๋ค๋ ๊ฑฐ๋๊น ํด๋น ์์์ ์ ์๋ ์คํ์ผ์ ์ ์ฉํ๋ ๊ฒ์ด๋ค.
FormControl ๋ด์ InputLabel์ด ์กด์ฌํ๋์ง์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ์คํ์ผ์ ์ ์ฉํ ์ ์๋ ๊ฒ!
์์์ ๋ผ๋ฒจ ์์๋ ์ ํ์๋ก ์ ์ด์ค '& .MuiSelect-select' ๋ถ๋ถ์ ์๋ ์ฝ๋์ฒ๋ผ ์ง์ MuiSelect ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ๋ ์ ์ดํ ์๋ ์๋ค.
MuiSelect: {
styleOverrides: {
select: {
padding: '1rem', //์
๋ ํธ ๋ผ๋ฒจ์์๋ ๊ธฐ๋ณธ ํจ๋ฉ
},
},
},
๋
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
vite stage ๊ฐ๋ฐ/๋ฐฐํฌ ๋ชจ๋ cli ์ค์ (0) | 2024.07.17 |
---|---|
React testing - What to test, getBy vs queryBy, fireEvent vs userEvent (0) | 2024.06.20 |
Turborepo turbo.json build outputs ๋น๋๊ฒฐ๊ณผ๋ฌผ ๊ฒฝ๋ก (0) | 2024.05.28 |
react daum postcode service api ์ฐํธ๋ฒํธ ์ฐพ๊ธฐ+์๊ฒฝ๋ ๋ฐ์ดํฐ ๋ฐ์์ค๊ธฐ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ (0) | 2024.04.26 |
html a ํ๊ทธ ๊ฐ์ด๋ฐ ์ ๋ ฌํ๊ธฐ (0) | 2024.04.16 |