실전 리액트 프로그래밍을 읽으면서 리액트 코드 작성을 할떄 가독성과 생산성을 높여주는 방법을 정리해 보려 한다.
책에는 자바스크립트 기준으로 나와있는데 나는 타입스크립트를 사용하기 때문에 내가 사용하던 방법이랑 합쳤다
interface IMyComponentProps {
name: string;
id: number;
}
export const MyComponent = ({ name, id }: IMyComponentProps) => {
return <div></div>;
};
const DEFAULT_NAME = "kim";
export const MyComponent = ({ name, id }: IMyComponentProps) => {
const [userName, setUserName] = useState(name);
const [userId, setUserId] = useState(id);
useEffect(() => {
setUserName("kim");
});
useEffect(() => {
setUserId(25);
});
return <div></div>;
};
나는 위코드처럼 상태값을 상단에서 정의하고 useEffect를 그 다음에 모아서 정의했다 근데 이게 더 많아지고 길어지면 항상 보기가 불편했는데 이책에서는 기능별로 모으는게 좋다고 해서 앞으로는 아래 코드 처럼 작성 할 생각이다
export const MyComponent = ({ name, id }: IMyComponentProps) => {
const [userName, setUserName] = useState(name);
useEffect(() => {
setUserName("kim");
});
const [userId, setUserId] = useState(id);
useEffect(() => {
setUserId(25);
});
return <div></div>;
};
export const MyComponent = ({ name, id }: IMyComponentProps) => {
const userName = useUserName(name);
const userId = useUserId(id);
return <div></div>;
};
hooks/use-username.tsx
hooks/use-userid.tsx
export const useUserName = (name: string) => {
const [userName, setUserName] = useState(name);
useEffect(() => {
setUserName("kim");
});
return userName;
};
export const useUserId = (id: number) => {
const [userId, setUserId] = useState(id);
useEffect(() => {
setUserId(25);
});
return userId;
};
이렇게 커스텀 훅으로 빼면 컴포넌트의 코드가 훨씬 짧아진다.
📌 그렇다고 이렇게 복잡하지 않은 코드를 커스텀 훅으로 빼면 오히려 가독성이 떨어지니 필요할때만 사용하자!
우선 나는 지금까지 리액트 코드를 짜면서 if문은 사용해 본적 없다.
왜냐하면 삼항 연산자와 &&가 가독성이 훨씬 좋기 떄문이다.
이 책에서도 삼항 연산자와 &&를 추천하고 있다.
아래 코드처럼 사용하는게 삼항연산자이다
isLogin이 참이면 왼쪽 거짓이면 오른쪽을 실행시키는 것이다.
{isLogin ? {"login"} : null}
위 코드와 같은 결과를 나타내는데 위 처럼 삼항연산자의 결과가 null이 있을경우 사용하면 좋다
앞의 경우가 참이면 뒤의 경우가 출력되고
앞의 경우가 거짓이면 그 이후로는 출력되지 않는다.
{isLogin && {"login"}}
내가 사용해왔던 방식인데 정확히 어떤 방식인지 몰랐는데 책을 통해 알게 되었다.
이 방식은 비지니스 로직과 상태값의 유무로 컴포넌트를 분리하는 방식이다.
컨테이너 컴포넌트에서 비즈니스 로직과 상태값을 관리해서 내부의 프레젠테이션 컴포넌트에 props로 내려주고 프레젠테이션 컴포넌트 에서는 받은 값들로 view만 보여주는 것이다.
어차피 react는 spa이기 때문에 페이지 컴포넌트 내에서 모든 컴포넌트를 불러온다.
그래서 나는 페이지 컴포넌트를 컨테이너 컴포넌트로 정의해서 여기 안에서 비지니스 로직을 다 처리하고 props들을 뿌려줬다.
이렇게 되면 코드 길이가 또 너무 길어지는 단점이 있었는데
커스텀 훅으로 빼거나 valtio같은 상태관리 함수를 써서 코드를 간결하게 정리 했었다
valtio 정리
❗️지금까지 최대한 코드를 간결하고 보기좋게 짜려고 노력했었는데 이 책의 내용과 내 방식이 얼추 비슷해서 하던대로 하면 될것 같다!
참고 :실전 리액트 프로그래밍