공용으로 사용할 커스텀 버튼 컴포넌트를 만들어보자.
CustomButton.tsx (컴포넌트)
import React from 'react';
type ButtonTypes = React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
export interface ButtonProps extends ButtonTypes {
onClick: () => void;
children: React.ReactNode;
}
const CustomButton = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ onClick, className, children, ...props }, ref?: React.Ref<HTMLButtonElement>) => {
const classNames = [className, 'custom-btn'].filter(v => Boolean(v)).join(' ') || undefined;
return (
<button ref={ref} className={classNames} onClick={onClick} {...props}>
{children}
</button>
);
},
);
export default CustomButton;
ButtonTypes 타입을 지정해주고 props들을 받아서 button에 넣어준다.
className은 받아서 사용한다.
사용 (부모)
<CustomButton children={"버튼"} onClick={()=>{console.log('custom button')}} />
버튼 스타일
.custom-btn {
width: fit-content;
height: 36px;
white-space: nowrap;
font-size: 14px;
font-weight: 500;
background-color: map-get($grays, "900"); /* 컬러 정의해서 넣기 */
border: 1px solid map-get($grays, "900");
border-radius: 4px;
display: flex; /* 이모지 등 아이콘이 들어갈수있으므로 flex 처리한다 */
align-items: center;
padding: 0 16px;
color: $white; /* 컬러 정의해서 넣기 */
line-height: 16px;
cursor: pointer;
&.color-white {
background-color: $white;
border: 1px solid map-get($grays, "400");
color: map-get($grays, "900");
&:hover {
background-color: map-get($grays, "100");
}
&.no-outline {
border: 0;
}
&:disabled {
color:#fff;
}
}
&:disabled {
background-color: map-get($grays, "400");
border-color:map-get($grays, "400");;
&:hover {
background-color: map-get($grays, "400");
cursor: default;
}
}
}
재사용가능한 기본 버튼 컴포넌트를 만들었다.
반응형
'[Develop] 개발공부 > FE - 프론트엔드' 카테고리의 다른 글
[Next] next 에서 scss 사용하기 및 레이아웃 구조 (0) | 2022.06.20 |
---|---|
[React] JSX 없이 React 사용하기. createElement (0) | 2022.06.17 |
[Javascript ] 깊은복사와 얕은복사, 그리고 원시형 참조형 데이터 (0) | 2022.05.31 |
[Javascript] Nullish coalescing operator / 널리쉬 병합 논리 연산자 (2) | 2022.05.21 |
[Javascript] for, forEach, for in, for of, map으로 반복 수행하기 (2) | 2022.05.01 |