- NodeJS 최신화
nvm install --lts
- CRA + TypeScript + Chakra.UI
npx create-react-app . --template @chakra-ui/typescript
- React-Router-Dom
npm i react-router-dom
- TanStack-Query
npm i @tanstack/react-query axios @tanstack/react-query-devtools
- Component
- JSX
- Prop
- Interface
src/
index/tsx
/App.tsx
/react-app-env.d.ts
제외하고 모두 지워주기
src/components
- 재사용을 염두하고 만든 component들
Root.tsx
도 여기에 포함된다
src/routes
- 특정 route에만 사용되는 component들
<App />
대신<RouterProvider router={router} />
를 만든다./
에router.tsx
를 만든 후,createBrowserRouter
를 선언해 router 변수에 넣어export default
한다.
createBrowserRouter
는path
을 마치json
구조로 작성하는 경험을 제공한다
// index.tsx
import { RouterProvider } from "react-router-dom";
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>,
)
// router.tsx
import { createBrowserRouter } from "react-router-dom";
const router = createBrowserRouter([
{[PATH]},
...
]}
export default router;
[PATH]
는 기본적으로 url인path
와 container인element
를 가진다
{
path: "/",
element: <Root />,
}
<Root />
를 extend하는 page를 만들고 싶다면children
에 해당되는path
를 만들어준다children
은<Outlet />
에서 구현된다
//router.tsx
{
path: "/",
element: <Root />,
children: [
{
path: "/",
element: <Home />,
}, ...
]
}
//Root.tsx
import { Outlet } from "react-router-dom";
export const function Root() {
return(
<Box>
...
<Outlet />
</Box>
);
}
404
처리를 하고싶다면errorElement
을 지정해준다
{
path: "/",
element: <Root />,
errorElement: <NotFound />,
children: [ ~ ],
...
}
<a href="~">
는 React가 다시 Reload되므로<Link to="~">
를 사용한다import { Link } from "react-router-dom"; <Link to="~"> ... </Link>
<ChakraProvider>
를 최상위 component를 감싼다import { ChakraProvider } from "@chakra-ui/react"; ... <ChakraProvider> <App /> </ChakraProvider>
npm i react-icons --save
- react-icons 사용하기
import { FaAirbnb } from "react-icons/fa"; ... <FaAirbnb />
- icon에 color를 주려면
<Box>
로 씌워준 뒤 Box에 color를 준다<Box color="red.500"> <FaAirbnb size={"48"}> </Box>
rem
: 1rem은 16px과 같다(=4)- 16px인 spacing:
spacing={2}
- 48px인 fontsize:
size={"48"}
- 16px인 spacing:
<Divider />
: HTML
과 유사함.
<Box>
- HTML
<div>
와 같다. 모든 Component와 공통되는 속성을 가진다. w
(=width
) /h
(=height
)minW
(=minWidth
) /minH
(=minHeight
)p
(padding) /px
/py
border
borderBottom
borderBottomWidth
- flex
justify
(=justifyContent
)align
(=alignItems
)direction
(=flexDirection
)
- HTML
<Stack>
/<VStack>
/<HStack>
flex-direction
이 적용된Stack
- Stack 안 Element들간에는 여백이 기본으로 적용되어있다
- ResponsiveDesign으로 인해 flex-direction이 바뀐다면 그냥
<Stack>
을 사용한다 spacing
<Grid>
display: grid
한<div>
이다templateColumns
- 직접 지정해주거나,(
"5fr 1fr"
) - repeact를 활용한다 (
"repeact(5, 1fr)"
)
- 직접 지정해주거나,(
- Element의 형태와 관련된 Component
<Button>
variant
: Button 스타일solid
/outline
/ghost
/link
colorScheme
: Button 색조size
: Button 크기leftIcon
: 왼쪽 아이콘 삽입isLoading
loadingText
<IconButton>
<Button>
은 상속받음icon
: 사용할 Icon Componentaria-label
: ScreenReader 사용자를 위한 내용
<Input>
- HTML prop을 그대로 가짐.
placeholder
<InputGroup> <InputLeftElement children={ <Box color="gray.500"> <FaUser /> </Box> }> <Input variant={"filled"} placeholder="username" /> </InputGroup>
- HTML prop을 그대로 가짐.
<InputGroup>
- 특정 Input관련된 Container들을 묶는 역할.
<InputLeftElement>
children
: Input 좌측에 들어갈 Element로 보통 Icon이다
- 브라우저 화면을 차지하는 요소와 관련된 Component
<Modal>
<Modal>
isOpen
: Modal의 초기상태.True
/False
onClose
: Modal을 close하는 functionmotionPreset
: Modal Animation 방식(기본값:scale
)
useDisclosure();
- modal의 state를 변경해주는 function을 제공함.
import { useDisclosure } from '@chakra-ui/react'; const { isOpen, onClose, onOpen } = useDisclosure(); ...
- 여러 Modal을 사용하는 경우, 각 함수 이름을 다르게 선언한다.
const { isOpen: isLoginOpen, onClose:onLoginClose, onOpen: onLoginOpen } = useDisclosure();
<ModalOverlay>
: Modal을 부각시키도록 주변부를 어둡게 함<ModalContent>
: Modal의 Body<ModalHeader>
: Modal의 Header<ModalFooter>
: Modal의 Footer<ModalCloseButton>
: Modal 우상측의 종료버튼
<Image>
- HTML
<img>
prop을 그대로 가짐.
- HTML
src/
에theme.ts
만들기
- 기존 theme에
initialColorMode
와useSystemColorMode
설정값을extendTheme
하여 넣는다.initialColorMode
에서 설정한 값은 브라우저의LocalStorage
에 저장된다light
/dark
/system
import { extendTheme, type ThemeConfig } from "@chakra-ui/react"
const config:ThemeConfig = {
initialColorMode: "light",
useSystemColorMode: false,
};
const thee = extendTheme({ config });
export default theme;
ChakraProvider
에theme
을 prop으로 넘긴다
import theme from "./theme";
<ChakraProvider theme={theme}>
- client가 마지막으로 한 ColorMode을 설정을
<ColorModeScript>
로 불러온다.
<ChakraProvider theme={theme}>
<ColorModeScript initialColorMode={theme.config.initialColorMode}> />
colorMode
를 바꾸려면toggleColorMode
을 실행한다
const { toggleColorMode } = useColorMode();
<IconButton
onClick={toggleColorMode}
...
/>
colorMode
에 따라 element가 바뀌길 원한다면colorMode
를 조건으로 두거나useColorModeValue
에 두가지 상태를 설명한다.
colorMode
를 조건으로 두기
const { colorMode } = useColorMode();
icon={colorMode === "light" ? <FaMoon /> : <FaSun />}
useColorModeValue
로colorMode
에 따른 element 변화주기
const logoColor = useColorModeValue([LIGHT_MODE], [DARK_MODE]);
<Box color={logoColor}>
...
Component
를useColorModeValue
를 사용하는 경우 다음과 같이 작성한다.- 변수명은 대문자로 시작해야 한다
- 컴포넌트는 태그 없이 이름을 적는다
const Icon = useColorModeValue(FaMoon, FaSun);
- 특정 Element를 반응형으로 다루고 싶다면,
{{}}
안에 size마다 값을 어떻게 다루고 싶은지 표현한다spacing={{ base: ~, sm: ~, md: ~, xl: ~, "2xl": ~, }}
npm i js-cookie && npm i @types/js-cookie -D