: 하나의 redux state 단위(객체라고 했을 때)에서 하위 depth의 프로퍼티 값을 변경했을 때(dispatching),
useSelector 가 뭐를 타겟으로 하고 있냐에 따라 리렌더링 로직이 어떻게 바뀌는지를 확인하고자 합니다.
예를 들어, server 라는 redux state 에
{
members: { host: [], guest: [] },
spaces: { spaceNames: [], spaceNumbers: [] },
}
이런식으로 데이터가 있다고 가정했을 때,
const initialState: ServerState = {
members: { host: [], guest: [] },
spaces: { spaceNames: [], spaceNumbers: [] },
};
위와 같은 상황을 가정했을 때, members에 hosts에 push를 하면(dispatch)
spaces를 구독하고 있는 컴포넌트 혹은 server state 자체를 구독하고 있는 컴포넌트 등에서 리렌더링이 일어나는지 안나는지 등을 확인하고자 합니다.
App.tsx (최상위 컴포넌트)
Spaces.tsx & Members.tsx(하위 컴포넌트 & 같은 레이어) 와 같은 구조로 돼있다고 했을 때,
Spaces에서는
const spacesNames = useSelector(
(state: RootState) => state?.server.spaces.spaceNames
);
Members 에서는
const hostMembers = useSelector(
(state: RootState) => state?.server.members.host
);
각각을 구독하고 있습니다. 마지막으로 App에서는
const server = useSelector((state: RootState) => state?.server);
를 구독하고 있습니다.
:: 리렌더링이 되면 테두리가 표시되도록 했습니다.
위의 상황에서 server state와 같이 최상위 depth인 state를 구독하는 A라는 컴포넌트가 있을 때, 하위 depth state(예를 들어, members 등)를 B 컴포넌트에서 업데이트 하면 무조건 A 컴포넌트는 리렌더링 됩니다. 이 때 React.memo 등을 써서 막아놓지 않으면 A 컴포넌트의 하위 컴포넌트도 당연히 리렌더링 됩니다.
하지만 역으로 하위 depth의 프로퍼티를 구독하고 있을 때는, 예를 들어, 아래와 같이
const hostMembers = useSelector(
(state: RootState) => state?.server.members.host
);
특정 depth의 프로퍼티를 타겟팅해서 구독하고 있는 컴포넌트 B는 해당 property가 업데이트 되지 않는 이상 리렌더링 되지 않습니다(물론 부모 컴포넌트가 리렌더링되고 React.memo 등의 최적화를 안해놨다면 리렌더링 됩니다). 즉, 다른 컴포넌트에서 server.members.host가 아닌 depth server.members.guest라는 프로퍼티가 있다고 했을 때 host만 건들지 않으면 리렌더링 되지 않습니다(같은 depth라도 구독중인 프로퍼티만 건들지 않으면 됩니다.).