[5팀 양성진] Chapter 1-3. React, Beyond the Basics#46
[5팀 양성진] Chapter 1-3. React, Beyond the Basics#46Yangs1s wants to merge 10 commits intohanghae-plus:mainfrom
Conversation
- array일시 이 부분을 제거함 - 하단에 for-of문의 코드가 중복적으로 같은 일을 하는걸 알게되었고, 제거 및 너무 길어지는건 따로 함수로 분리시킴
|
나이스 |
|
fiber 에 대해서 잘 정리된 것 같아요 |
굳굳 감사요 정석님도 나이스 |
감사합니다! |
| show(...args); | ||
| hideAfter(); | ||
| }; | ||
| const actions = useMemo(() => { |
There was a problem hiding this comment.
useMemo 를 사용할 때 의존성 배열에 사용중인 값을 넣어주면 좋을 것 같아요
예상하지 못한 오류가 발생할 수 있음
| } | ||
|
|
||
| for (const key of keysA) { | ||
| if (!deepEquals((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) return false; |
| return Object.prototype.hasOwnProperty.call(obj, key); | ||
| } | ||
|
|
||
| function isNotNull(obj: unknown) { |
There was a problem hiding this comment.
function isNotNull(obj: T) : obj is NonNullable
이런 식으로 타입 추론이 가능하게 작성하는 방법도 있어요!
|
|
||
| export const useAutoCallback = <T extends AnyFunction>(fn: T): T => { | ||
| return fn; | ||
| const lastFnRef = useRef<T | null>(null); |
There was a problem hiding this comment.
입력받은 fn 을 초기값으로 할당하면 null 인 경우를 고려하지 않아도 되서 단순해질 것 같아요
| // step 2. 종속성이 변경되지 않았다면, 이전 값만 변환 변경되면 함수 다시 실행 | ||
| // 다시 계산하고 메모 그다음 이값을 반환. | ||
|
|
||
| if (ref.current === null) { |
There was a problem hiding this comment.
중첩된 조건문을 단순하게 만드는 것을 고려해보면 좋을 것 같아요
| const [state, setState] = useState<unknown>(initialValue); | ||
|
|
||
| // setState는 언제나 같은 함수를 반환 | ||
| const updateState = useCallback((newState: T) => { |
There was a problem hiding this comment.
useState set 함수는 변경할 상태 값을 넣을 수도 있지만, 함수를 넣을수도 있어서 함수를 받는 경우도 만족하도록 추가해보시면 좋을 것 같습니다
YeongseoYoon-hanghae
left a comment
There was a problem hiding this comment.
성진님 너무 고생하셨습니다 4주차도 킵고잉~
| if (ref.current === null) { | ||
| const result = factory(); | ||
| ref.current = { _deps, result }; | ||
| return ref.current.result; | ||
| } else { | ||
| if (_equals(ref.current._deps, _deps)) { | ||
| return ref.current.result; | ||
| } else { | ||
| const result = factory(); | ||
| ref.current = { _deps, result }; | ||
| return ref.current.result; | ||
| } | ||
| } |
There was a problem hiding this comment.
저는 개인적으로 코드의 가독성을 올리기 위해 불필요한 중첩 분기처리를 지양하는편입니다
ref.current === null 여기 분기에서 return을 한다면 else를 안써도 되지않을까요?
_equals(ref.current._deps, _deps) 여기도 마찬가지 일 거 같습니다
if (ref.current === null) {
const result = factory();
ref.current = { _deps, result };
return ref.current.result;
}
if (_equals(ref.current._deps, _deps)) {
return ref.current.result;
}
const result = factory();
ref.current = { _deps, result };
return ref.current.result;| <ToastStateContext value={{ ...state }}> | ||
| <ToastActionContext value={actions}> |
There was a problem hiding this comment.
아이디어) 어차피 action 호출할 때 message 를 함수 인자로 넘기므로 action에선 stateContext 가 필요 없는 것 같습니다, 오히려 순서를 바꿔서 Action → State로 감싸는 것이 불필요한 렌더링을 줄여서 더 효율적일 수 있지 않을까 싶어요...?
| // useSyncExternalStore 에서 활용할 수 있도록 subscribe 함수를 수정합니다. | ||
| const subscribe = (fn: Listener) => { | ||
| listeners.add(fn); | ||
| return () => unsubscribe(fn); |
There was a problem hiding this comment.
createObserver함수에서 unsubscribe를 객체 메서드에 담아 반환하지 않고 subscribe에서 cleanup 함수를 반환한 부분이 좋은 것 같아요
과제 체크포인트
배포 링크
https://yangs1s.github.io/front_6th_chapter1-3/
기본과제
equalities
hooks
High Order Components
심화 과제
hooks
context
과제 셀프회고
기술적 성장
물론 리액트를 잘 알고 써본건 아니여도 직장에서 쓰긴 써봐서. 이번 과제는 기존지식의 재발견과 조금 딥하게 공부를 좀 해봤던거 같아요.
그리고 새로운 개념들이 참 흥미롭게 다가온거도 많았습니다.
shallowEquals & DeepEqual 을 구현시 개념을 공부하고자 봤는데.
shallow compare을 통해서 참조타입 과 원시타입의 특징을 좀 더 명확하게 알게 되었고,
참조라는 특징을 좀 더 명확하게 알게된 계기가 되었습니다.
hooks 만들면서 알게된 fiber
리액트 16전에는 재조정(Reconciliation) 엔진이 Stack방식이지만 파이버 기반으로 16부터는 새롭게 바뀌었다. 이전엔 함수형컴퍼넌트안에서 hooks들을 사용할 수 없었지만 이 방식이 채택되고 사용가능 해졌다.
작업의 단위나 작업 방식, 장단점을 제외하고 나머진 AI에게 정리를 부탁해서 만들었습니다.
fiber 재조정자는 랜더링 단위를 더 잘게 나누어서 작업 우선순위가 높은거 부터 처리한다. 이게 핵심!
자랑하고 싶은 코드
개선이 필요하다고 생각하는 코드
수정전
너무 한 기능에 여러개를 때려박은거 같은거 같아서 찬규님 pr을 한번 읽어보면서
코드를 한번 기능별로 분할시켜봐야겠다 라는 생각이 들어서 한번 바꿔보려고 합니다. (-- 진행 중 ..---)
수정후,
조금 고쳐봤습니다.
테스트코드에서 배열과 객체일시 케이스가 나눠져있길래 배열일때를 따로 if문으로 작업했는데
Object.keys와 for-of로 이미 같은방식으로 처리하는 데 굳이 저게 필요한가 싶어서 중복기능이라 생각해 삭제했습니다.
그리고 내부가 좀 너무 길어지는 내용들이 많아서 따로 위에 함수를 만들어서 사용했습니다. 이러니까 저번보다 짧아지고 가독성도 쬐끔 올라간거같습니다.
학습 효과 분석
가장 많이 배웠다고 느낍니다.
과제 피드백
학습 갈무리
리액트의 렌더링이 어떻게 이루어지는지 정리해주세요.
리엑트에서의 렌더링
1단계,2단계는 렌더 phase, 3은 커밋 페이즈 이다.
재조정(Reconciliation)이란?
Current Tree는 현재 화면에 보여지고 있는 상태를 나타내는 트리
Work-in-Progress Tree는 새롭게 변화된 상태를 구성하는 트리
재조정의 목적
재조정에서 Key의 중요성
배열 렌더링에서 Key가 필수인 이유
Key가 있을 때의 동작
메모이제이션에 대한 나의 생각을 적어주세요.
메모이제이션
메모이제이션이란?
**메모이제이션(Memoization)**은 프로그래밍 최적화 기법 중 하나로, 흔히 **"기억하기 기술"**이라고도 부릅니다.
특정 값이나 함수를 캐싱하고 동일한 값의 불필요한 재계산을 방지하는 최적화 기법입니다
React의 메모이제이션 도구들
장단점
장점
단점
컨텍스트와 상태관리에 대한 나의 생각을 적어주세요.
Context API
핵심 개념
언제 사용하는게 좋을까요
상태관리 라이브러리
리뷰 받고 싶은 내용