Chakra UI의 재사용 구성 요소 확장 방법
1. 다른 부품으로 일반 포장
가장 놀라운 방법
const RoundedOutlineButton: FC<ButtonProps> = (props) => {
return <Button
variant="outline"
borderStyle="solid"
borderWidth="2px"
rounded="full"
px={10}
py={5}
letterSpacing="0.1em"
{...props} />
}
거의 8할은 이렇게 해결할 수 있다.<RoundedOutlineButton>hello</RoundedOutlineButton>
// 更にもうちょっと拡張したいなら
<RoundedOutlineButton p={10}>hello</RoundedOutlineButton>
refs
감는 데 시간이 걸린다단점:refs에 연루된 문제
예를 들어 상술한 상황에서
PopOver
와 조합된 상황에서refs의 문제가 발생한다<Popover>
<PopoverTrigger>
<RoundedOutlineButton>
</PopoverTrigger>
<PopoverContent>
<PopoverHeader>Confirmation!</PopoverHeader>
<PopoverBody>Are you sure you want to have that milkshake?</PopoverBody>
</PopoverContent>
</Popover >
Warning: Function components cannot be given refs.
Attempts to access this ref will fail. Did you mean to use React.forwardRef()?
이기 때문에ref 같은 것을 사용하려면 사용해야 한다forwardRef
import { forwardRef } from '@chakra-ui/react'
// before
// const RoundedOutlineButton: FC<ButtonProps> = (props) => {
// after
const RoundedOutlineButton = forwardRef<ButtonProps, "button">((props, ref) => {
return <Button
variant="outline"
borderStyle="solid"
borderWidth="2px"
rounded="full"
ref={ref}
px={10}
py={5}
letterSpacing="0.1em"
{...props} />
})
React.forwardRef
도 가능하지만 몰드chakra-ui의forwardRef를 사용한다면 TS라면 조금 더 즐거울 수 있어요.2. Theme로 전체를 바꾼다
만약'이 사이트는 모두 양식을 바꾸고 양식을 바꿀 수 있다'는 조건이 충족된다면
theme
방법도 사용할 수 있다import { extendTheme } from '@chakra-ui/react'
const providerTheme = extendTheme({
components: {
Button: {
variants: {
outline: {
bg: "white",
borderStyle: "solid",
borderWidth: "2px",
rounded: "full",
px: 10,
py: 5,
letterSpacing: "0.1em",
},
}
}
}
})
<ChakraProvider theme={providerTheme}>
<Button variant="outline" colorScheme="blue">Provider Theme</Button>
</ChakraProvider>
3. Theme를 새로운 variant으로 만들기
2를 조금 더 연하게 해라.새로운 variant 만들기
import { theme, extendTheme } from '@chakra-ui/react'
const providerThemeAppendVariant = extendTheme({
components: {
Button: {
variants: {
customOutline: (props) => {
return {
...theme.components.Button.variants.outline(props),
bg: "white",
borderStyle: "solid",
borderWidth: "2px",
rounded: "full",
px: 10,
py: 5,
letterSpacing: "0.1em",
}
},
}
}
}
})
<ChakraProvider theme={providerThemeAppendVariant}>
<Button variant="customOutline" colorScheme="blue">Provider Custom variant Theme</Button>
</ChakraProvider>
4. chakrafactory 기능으로 확장
상당히 제한적이지만 factory에서 확장도 고려할 수 있다.
const RoundedOutlineButton = chakra(Button, {
baseStyle: {
bg: "white",
borderStyle: "solid",
borderWidth: "2px",
rounded: "full",
px: 10,
py: 5,
letterSpacing: "0.1em",
}
})
<RoundedOutlineButton variant="outline" colorScheme="blue">
Factory Custom Button
</RoundedOutlineButton>
2021/06/20 추기
v1.7.0부터factory의baseStyle도 함수를 제공함으로써props[1]를 획득할 수 있습니다
const RoundedOutlineButton = chakra(Button, {
baseStyle: (props) => {
return {
bg: props.bg,
borderWidth: "2px",
rounded: "full",
px: 10,
py: 5,
letterSpacing: "0.1em",
}
}
})
더미도 얻을 수 있으니까 그럴 수도 있지const RoundedOutlineButton = chakra(Button, {
baseStyle: ({ theme, ...props }) => {
return {
...theme.components.Button.variants.outline(props),
// borderStyle: "solid",
borderWidth: "2px",
rounded: "full",
px: 10,
py: 5,
letterSpacing: "0.1em",
}
}
})
또한, 형식적으로 잘 대응하지는 않지만, 아래와 같이 CSS 이외의 props도 전달되기 때문에 colorScheme
그런 것도 이용할 수 있다const RoundedOutlineButton = chakra(Button, {
baseStyle: (props) => {
// @ts-ignore
const { colorScheme } = props
return {
bg: `white`,
color: `${colorScheme}.600`,
borderColor: `${colorScheme}.600`,
borderStyle: "solid",
borderWidth: "2px",
rounded: "full",
px: 10,
py: 5,
letterSpacing: "0.1em",
_hover: {
bg: `${colorScheme}.50`
}
}
}
})
결론
기본적으로 1입니다. forwardRef에 주의하는 것이 좋습니다.
각오가 있다면 아마도
각주
PR은 던지자마자 통과했어요.https://github.com/chakra-ui/chakra-ui/releases/tag/%40chakra-ui%2Fsystem%401.7.0 ↩︎
Reference
이 문제에 관하여(Chakra UI의 재사용 구성 요소 확장 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/terrierscript/articles/2021-05-11-chakra-ui-component-extends텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)