๐ Book Shelf Web Application in TypeScript, React and Redux.
npx create-react-app . --template typescriptyarn add react-router-dom
yarn add @types/react-router-dom -D # ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ํจyarn add react-error-boundary # componentDidPatch๋ก ๋ฐํ์ ์๋ฌ ํธ๋ค๋ง โ ์๋ฌ ํ์ด์ง๋ก ์ด๋์ํจ๋ค.import { ErrorBoundary } from "react-error-boundary";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import Error from './pages/Error';
<ErrorBoundary FallbackComponent={Error}>
<BrowserRouter>
<Switch>
<Route />
{/* ... */}
</Switch>
</BrowserRouter>
</ErrorBoundary>yarn add redux react-redux redux-saga redux-devtools-extension redux-actions
yarn add @types/{react-redux,redux-actions} -D.
โโโ src
โโโ redux
โโโ create.ts
โโโ modules
โโโ reducer.ts
โโโ auth.ts
โโโ rootSaga.ts
yarn add antd
yarn add @ant-design/icons// index.tsx
import 'antd/dist/antd.css';// signin.tsx
/* ... */
const emailRef = useRef<Input>(null); // null ํ ๋น์ ํตํด ํ์
์๋ฌ ๋ฐฉ์ง
/* ... */
<Input ref={emailRef} />
/* ... */children์ ์ ์ธํ๊ณ ๋ interface์์ ์ ์ํ ํ์
๊ณผ Component์ props๊ฐ ๋์ผํด์ง๋๋ค.
// Signin.tsx (Component)
type LoginReqType = { // types.ts๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ฌ์ฌ์ฉํ๊ฒ ํจ
email: string;
password: string;
};
interface SigninProps {
login: (reqData: LoginReqType) => void;
}
const Signin: React.FC<SigninProps> = ({ login }) => {
return <div></div>;
};// SigninContainer.tsx (Container)
export default function SigninContainer() {
const login = useCallback((reqData) => {
/* saga ํจ์ ํธ์ถ ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ถ๋ถ */
}, []);
return <Signin login={login} />;
}.
โโโ src
โโโ redux
โ โโโ create.ts
โ โโโ modules
โ โโโ reducer.ts
โ โโโ auth.ts
โ โโโ rootSaga.ts
โ
โโโ services
โ โโโ UserService.ts
โ
โโโ types.ts
// services/UserService.ts
/* Token ๋ฐ๊ธ์ ์ํ API ๋ก์ง ๋ถ๋ฆฌ */
import axios from 'axios';
import { LoginReqType } from '../types';
const USER_API_URL = '';
/* API */
export default class UserService {
public static async login(reqData: LoginReqType): Promise<string> {
const response = await axios.post(USER_API_URL, reqData);
return response.data.token;
}
}npx husky install
yarn add lint-staged -D
npx husky add .husky/pre-commit 'lint-staged'