๐คฉ React JS๋ก ์ฌ์ฉ์ ์ง์ ๋ฒํผ ๊ตฌ์ฑ ์์ ๊ตฌ์ถ
24621 ๋จ์ด webdevreactjavascriptcss
์๋๋ ์ด ํํ ๋ฆฌ์ผ์์ ๋น๋ํ ๋ฐ๋ชจ์ ๋๋ค.
โ๏ธ ๋ฒํผ ์ปดํฌ๋ํธ ์ํ
์ฐ๋ฆฌ๋ ์ด ๊ตฌ์ฑ ์์์ ๋ํ ๋ช ๊ฐ์ง ์ํ์ ๊ฐ์ง๋ฏ๋ก ์ธ๋ถ์์ ์ด๋ฅผ ์ฌ์ฉ์ ์ ์ํ๊ฑฐ๋ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํ ์ ์์ต๋๋ค. ์ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
white
์ด์ง๋ง btnColor
์ ๋ฐ๋ผ ์ฌ๋ฐ๋ฅธ ๋๋น๋ฅผ ๊ฐ๋๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. onClick
ํธ๋ค๋ฌ๊ฐ ๋ฒํผ์ ํ์๋ฉ๋๋ค. outline | block | rounded
์ค ํ๋์
๋๋ค. ์ด ์ํ์ด ์ ๋ฌ๋์ง ์์ผ๋ฉด ๋ฒํผ์ ๊ธฐ๋ณธ ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค. ๐๋ฒํผ์ ๊ธฐ๋ณธ ์คํ์ผ๋ง
๋ฒํผ์ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์คํ์ผ์ ๋ถ์ฌํฉ๋๋ค. ์ฌ๊ธฐ์์
button.module.css
ํ์ผ์ ์์ฑํ ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ๋ฒํผ์ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์คํ์ผ์ ์ ๊ณตํ๊ธฐ ์ํด btn
ํด๋์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
/* button.module.css */
.btn {
font-family: 'Ubuntu', sans-serif;
position: relative;
font-weight: 400;
font-size: 1.3rem;
line-height: 2;
height: 50px;
transition: all 200ms linear;
border-radius: 4px;
width: 240px;
letter-spacing: 1px;
display: inline-flex;
align-items: center;
justify-content: center;
text-align: center;
align-self: center;
border: none;
cursor: pointer;
box-shadow: 0 12px 35px 0 rgba(16, 39, 112, .25);
outline: 0;
text-transform: capitalize;
}
๐ ๋ฒํผ ๊ธฐ๋ฅ ์ปดํฌ๋ํธ ์์ฑ
์ด์ ์ฌ์ฉ์ ์ ์ ๋ฒํผ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ ํ์ผ
Button.js
์ ์์ฑํฉ๋๋ค. ์ด ํ์ผ์์๋ styles
ํ์ผ์์ button.module.css
๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ์ฌ๊ธฐ์์ ๊ธฐ๋ณธ HTMLbutton
์์๋ฅผ ๋ฐํํ๊ณ btn
์์ styles
ํด๋์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ชจ๋ ์ํ์ ๋ถํดํฉ๋๋ค.//Button.js
import React from 'react';
import styles from './button.module.css';
const Button = ({ children, onClick, btnColor = 'teal', labelColor, disabled, type, style, ...props }) => {
return (
<button
className={styles.btn}
>
{children || 'label'}
</button>
);
};
export default Button;
์ด์ ์ด ํ์ผ
Button.js
์์ ๋ค์ํ ์ ํ์ ๋ฒํผ์ ๋ํ ๋ช ๊ฐ์ง ์คํ์ผ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
//Button.js
const commonStyles = {
backgroundColor : btnColor,
color : labelColor || 'white'
};
const outlineStyles = {
border : `1px solid ${btnColor}`,
color : btnColor,
backgroundColor : 'white'
};
const outlineHoverStyle = {
color : labelColor || 'white',
backgroundColor : btnColor
};
const roundedStyle = {
backgroundColor : btnColor,
color : labelColor || 'white',
borderRadius : '25px'
};
const disabledStyle = {
cursor : 'default',
backgroundColor : btnColor,
color : labelColor || 'white',
opacity : 0.4
};
const blockStyles = {
width : '95%',
margin : '0 auto'
};
์ฌ๊ธฐ์๋ ๋ชจ๋ ์ ํ์ ๋ฒํผ์ ์ถ๊ฐ๋
btnColor
์ ๋ฐ๋ฅธ ๊ณตํต ์คํ์ผ์ด ์์ต๋๋ค. ๋ฐ๋ฉด์ ๋ค๋ฅธ ๋ชจ๋ ์คํ์ผ์ ๋ฒํผ์ type
์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ์ถ๊ฐ๋ฉ๋๋ค. ์ฌ๊ธฐ์ outline
์ ํ์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ๋ฒํผ ์ ํ์ด ๊ฐ์์ผ ๋ ์ถ๊ฐ๋๋ ๊ธฐ๋ณธ outlineStyles์ด๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ๋ฒํผ ์๋ก ๋ง์ฐ์ค๋ฅผ ๊ฐ์ ธ๊ฐ ๋์
๋๋ค.๋ฐ๋ผ์ ํธ๋ฒ ์ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ํธ๋ฒ ์คํ์ผ์ ์กฐ๊ฑด๋ถ๋ก ์ถ๊ฐํ
state
react hook๋ก useState()
ํธ๋ฒ๋ฅผ ์์ฑํฉ๋๋ค. Javascript ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐonMouseEnter
๋ฐ onMouseLeave
๋ฅผ ์ฌ์ฉํ์ฌ hover
์ํ๋ฅผ ํ ๊ธํฉ๋๋ค.์ด์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ๋จํ
switch
๋ฌธ์ ์ถ๊ฐํ์ฌ ๋ฒํผ ์ ํ์ ๋ฐ๋ผ ์คํ์ผ์ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํฉ๋๋ค.
//Button.js
let btnStyle;
switch (type) {
case 'rounded':
btnStyle = roundedStyle;
break;
case 'block':
btnStyle = blockStyles;
break;
case 'outline':
if (hover) {
btnStyle = outlineHoverStyle;
}
else {
btnStyle = outlineStyles;
}
break;
default:
btnStyle = {
backgroundColor : btnColor,
color : labelColor || 'white'
};
break;
}
๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ์ด์ ์ํ์์ ๋ฒํผ์ผ๋ก ์ ๋ฌ๋ ๋ชจ๋
btnStyle
์ ํจ๊ป ์ด style
๋ฅผ ์ถ๊ฐํ๊ณ ๋ฒํผ์ disabled
์ํ์ด ์๋ ๊ฒฝ์ฐ ๋นํ์ฑํ๋ ์คํ์ผ๋ ์ถ๊ฐํฉ๋๋ค. ์ต์ข
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
//Button.js
import React, { useState } from 'react';
import styles from './button.module.css';
const Button = ({ children, onClick, btnColor = 'teal', labelColor, disabled, type, style, ...props }) => {
const [
hover,
setHover
] = useState(false);
const toggleHover = () => {
setHover(!hover);
};
const commonStyles = {
backgroundColor : btnColor,
color : labelColor || 'white'
};
const outlineStyles = {
border : `1px solid ${btnColor}`,
color : btnColor,
backgroundColor : 'white'
};
const outlineHoverStyle = {
color : labelColor || 'white',
backgroundColor : btnColor
};
const roundedStyle = {
backgroundColor : btnColor,
color : labelColor || 'white',
borderRadius : '25px'
};
const disabledStyle = {
cursor : 'default',
backgroundColor : btnColor,
color : labelColor || 'white',
opacity : 0.4
};
const blockStyles = {
width : '95%',
margin : '0 auto'
};
let btnStyle;
switch (type) {
case 'rounded':
btnStyle = roundedStyle;
break;
case 'block':
btnStyle = blockStyles;
break;
case 'outline':
if (hover) {
btnStyle = outlineHoverStyle;
}
else {
btnStyle = outlineStyles;
}
break;
default:
btnStyle = {
backgroundColor : btnColor,
color : labelColor || 'white'
};
break;
}
return (
<button
style={
disabled ? { ...commonStyles, ...btnStyle, ...disabledStyle, ...style } :
{ ...commonStyles, ...btnStyle, ...style }
}
onMouseEnter={toggleHover}
onMouseLeave={toggleHover}
{...props}
type="button"
onClick={
!disabled ? onClick :
() => {}
}
className={styles.btn}
>
{children || 'button'}
</button>
);
};
export default Button;
Here ๋ผ์ด๋ธ ๋ฐ๋ชจ๋ฅผ ๋ณด๊ณ ์ด ๊ตฌ์ฑ ์์์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
์ด ํํ ๋ฆฌ์ผ์ ์ดํดํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด์ ๊ฐ์ ๋ ๋ง์ ํํ ๋ฆฌ์ผ์ ๋ณด๋ ค๋ฉด ์ ๊ฐ์ธ ๋ธ๋ก๊ทธsatishnaikawadi.me๋ฅผ ๋ฐฉ๋ฌธํ์ธ์. ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐คฉ React JS๋ก ์ฌ์ฉ์ ์ง์ ๋ฒํผ ๊ตฌ์ฑ ์์ ๊ตฌ์ถ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/satishnaikawadi2001/build-custom-button-component-with-react-js-196fํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค