source

레독스는 그저 글로벌한 국가일 뿐이지 않나요?

ittop 2023. 3. 23. 23:09
반응형

레독스는 그저 글로벌한 국가일 뿐이지 않나요?

그래서 저는 일주일 전에 React를 배우기 시작했고 필연적으로 상태 문제와 컴포넌트가 나머지 앱과 통신하는 방법에 대해 알게 되었습니다.검색해보니 레독스가 이달의 맛인 것 같아요.모든 문서를 읽었는데, 사실 상당히 혁신적인 아이디어라고 생각해요.이에 대한 제 생각은 다음과 같습니다.

국가는 일반적으로 상당히 사악하고 프로그래밍에서 버그를 많이 발생시킨다는 데 동의한다.어플리케이션 전체에 분산시키는 것이 아니라 글로벌 스테이트 트리에 모든 것을 집중시키는 것이 어떻겠냐고 Redux는 말합니다.변화를 위해 액션을 실행해야 합니다.재미있겠다.모든 프로그램에는 상태가 필요하므로 버그를 추적하기 쉽도록 하나의 불순한 공간에 삽입하고 내부에서만 수정해 봅시다.또한 개별 상태 조각을 React 컴포넌트에 선언적으로 바인드하여 자동 재묘화하면 모든 것이 아름다워집니다.

하지만 이 디자인 전체에 대해 두 가지 질문이 있습니다.예를 들어, 스테이트 트리가 불변할 필요가 있는 이유는 무엇입니까?시간여행 디버깅, 핫 새로고침, 이미 앱에 실행 취소/재도 구현되어 있다고 가정해 보십시오.이렇게 해야 하는 것이 너무 번거로운 것 같습니다.

case COMPLETE_TODO:
  return [
    ...state.slice(0, action.index),
    Object.assign({}, state[action.index], {
      completed: true
    }),
    ...state.slice(action.index + 1)
  ];

이것 대신:

case COMPLETE_TODO:
  state[action.index].completed = true;

학습 목적으로 온라인 화이트보드를 만드는 것은 말할 것도 없고, 모든 상태 변경은 명령어 목록에 브러시 스트로크를 추가하는 것만으로 간단할 수 있습니다.잠시 후(수백 번의 브러시 스트로크), 이 어레이 전체를 복제하는 것은 매우 많은 비용과 시간이 소요될 수 있습니다.

액션을 통해 변환되는 UI와 독립적인 글로벌 상태 트리는 괜찮지만, 꼭 불변해야 합니까?이렇게 간단한 구현이 문제입니까?(1분만에 초안 작성)

var store = { items: [] };

export function getState() {
  return store;
}

export function addTodo(text) {
  store.items.push({ "text": text, "completed", false});
}

export function completeTodo(index) {
  store.items[index].completed = true;
}

이 트리는 아직 전역 상태 트리로 생성되지만 매우 단순하고 효율적입니다.

레독스는 그저 글로벌한 국가일 뿐이지 않나요?

물론 그렇겠지.그러나 지금까지 사용한 모든 데이터베이스에 대해서도 마찬가지입니다.Redx는 컴포넌트가 반응적으로 의존할 수 있는 메모리 내 데이터베이스로 취급하는 것이 좋습니다.

불변성을 사용하면 아이덴티티 체크까지 간소화되므로 서브트리가 매우 효율적으로 변경되었는지 확인할 수 있습니다.

네, 구현은 효율적이지만 트리가 조작될 때마다 가상 돔 전체를 다시 렌더링해야 합니다.

React를 사용하는 경우 실제 dom에 대해 다른 작업을 수행하고 배치에 최적화된 최소한의 조작을 수행하지만 전체 하향식 재렌더링은 여전히 비효율적입니다.

불변 트리의 경우 상태 비저장 구성 요소는 종속된 하위 트리가 이전 값과 다른지 확인하기만 하면 됩니다. 그렇다면 렌더링을 완전히 피할 수 있습니다.

네, 그렇습니다!!!스토어에 특정 속성/변수/엔트리를 쓸 수 있는 권한이 누구에게 있는지에 대한 통치가 없기 때문에 실질적으로 다음과 같이 할 수 있습니다.dispatch조금도action코드 베이스가 증가하거나 여러 사람이 관리하면 코드는 유지하기가 더 어려워지고 스파게티도 마찬가지입니다.

처음 Redx를 사용했을 때도 같은 질문과 문제가 있었기 때문에 이 문제를 해결하는 라이브러리를 만들었습니다.
그것은 야시라고 불린다.
Yassi는 글로벌하게 읽을 수 있고 개인적으로 쓰기 가능한 저장소를 정의하여 귀하가 언급한 문제를 해결합니다.즉, 누구나 스토어에서 속성을 읽을 수 있습니다(예: Redx에서).
그러나 속성을 선언하는 개체인 속성의 소유자만 저장소에서 해당 속성을 기록/업데이트할 수 있습니다.

또한 Yassi는 주석을 사용하여 스토어에 진입을 선언하는 제로 보일러 플레이트 등의 다른 특전이 있습니다(사용).@yassit('someName'))
이 엔트리의 값을 갱신하는 경우 액션/삭감이나 기타 번거로운 코드 스니펫이 필요 없습니다.대신 일반 객체와 같이 변수를 갱신하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/33424157/isnt-redux-just-glorified-global-state

반응형