[TIL] 0516

yoon Y·2022년 5월 17일
0

2022 - TIL

목록 보기
85/109

바닐라 js과제 연습 - 기존의 베이스 컴포넌트의 구조로는 부모 상태 중 일부만 사용하는 컴포넌트를 선택적으로 리렌더링 시킬 수 없었다.

  // 이 경우 두 개의 상태 중 하나만 변경되어도 모든 자식 컴포넌트가 리렌더링 되는 문제점이 있음
  childUpdate() {
    const { searchData, selectedWords } = this.state;
    this.WordList.setState({ data: searchData });
    this.SelectedList.setState({
      items: this.limitFiveLength(selectedWords),
    });
  }

상태 각각을 구독할 수 있는 패턴을 찾아보았으나, prop으로 넘겨받으면 안되고 직접 가져다가 써야했다(import하거나 등등..)
prop으로 넘겨받게되면 해당 상태를 직접적으로 쓰는게 아닌 변수 복사되기 때문인 것 같다.

결국은 각 컴포넌트에서 현재 가진 state와(props으로 넘겨받은) setState를 통해 새로 들어온 state를 비교해서 다를 경우만 상태 변경+리렌더링되도록 메소드를 추가했다.

checkNeedRender(newState) {
    let needRender = false;
    const updateStateKey = Object.keys(newState);

    updateStateKey.map((key) => {
      if (
        !(JSON.stringify(this.state[key]) === JSON.stringify(newState[key]))
      ) {
        needRender = true;
      }
    });

    return needRender;
  }

  setState(newState, childUpdate = false) {
    const needRender = this.checkNeedRender(newState);
    if (!needRender) return;

    this.state = { ...this.state, ...newState };
    childUpdate ? this.childUpdate() : this.render();
  }
profile
#프론트엔드

0개의 댓글