-
Notifications
You must be signed in to change notification settings - Fork 8
[9주차/지니] 워크북 제출합니다. #100
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 지니/main
Are you sure you want to change the base?
[9주차/지니] 워크북 제출합니다. #100
Conversation
| import { create } from 'zustand'; | ||
| import type { CartItem } from '../constants/cartItems'; | ||
| import cartItems from '../constants/cartItems'; | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cart, modal을 하나의 store로 묶어서 괸리에 더 용이해보이는것같아요 !
컴포넌트에서 가져다 쓰기도 훨씩 직관적인것같아 좋은코드인것같습니다
| // 합계 계산 유틸리티 | ||
| const computeTotals = (items: CartItem[]) => { | ||
| return items.reduce( | ||
| (acc, item) => { | ||
| acc.amount += item.amount; | ||
| acc.total += item.amount * item.price; | ||
| return acc; | ||
| }, | ||
| { amount: 0, total: 0 } | ||
| ); | ||
| }; | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cart항목이 변할때 amount와 total을 다시 계산해야하는 이 로직을 헬퍼함수로 분리하여서 재사용성과 가독성 면에서 좋아보입니다!~!
| const Footer = () => { | ||
| const amount = useStore((state) => state.amount); | ||
| const total = useStore((state) => state.total); | ||
| const openModal = useStore((state) => state.openModal); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
연관된 값들을 한 번에 가져오고 싶을 때는 아래처럼 하나의 useStore 호출로 묶을 수 있어요.
다만 객체 셀렉터는 호출할 때마다 새로운 객체를 만들어서 반환하기 때문에,
shallow 없이 사용하면 값이 바뀌지 않아도 컴포넌트가 리렌더링될 수 있습니다.
그래서 아래 예시처럼 amount와 total을 묶어서 사용할 경우에는 shallow를 함께 적용하는 방식이 권장됩니다.
const { amount, total } = useStore(
(state) => ({ amount: state.amount, total: state.total }),
shallow
);
지금처럼 각각 따로 selector를 두면 레퍼런스가 안정적이라 불필요한 렌더링을 자연스럽게 피할 수 있어요!
이번 주 잘 해주셔서 따로 피드백 드릴 점이 없어 추가적인 TMI 적어드리고 갑니다!
✅ 워크북 체크리스트
✅ 컨벤션 체크리스트
📌 주안점