React-Redux : 모든 구성 요소 상태가 Redux Store에 유지되어야 함


89

간단한 토글이 있다고 가정 해 보겠습니다.

버튼을 클릭하면 색상 구성 요소가 빨간색과 파란색으로 바뀝니다.

나는 이와 같은 일을함으로써이 결과를 얻을 수있다.

index.js

Button: onClick={()=>{dispatch(changeColor())}}
Color: this.props.color ? blue : red

container.js

connect(mapStateToProps)(indexPage)

action_creator.js

function changeColor(){
 return {type: 'CHANGE_COLOR'}
}

reducer.js

switch(){
case 'CHANGE_COLOR':
return {color: true}

그러나 이것은 jQuery, 일부 클래스 및 일부 CSS를 사용하여 5 초 만에 달성 할 수있는 작업을 작성하기위한 엄청난 코드입니다.

그래서 제가 정말로 묻는 것은 여기서 제가 뭘 잘못하고있는 것일까 요?


6
react-redux는 jquery보다 짧은 것으로 판매되지 않습니다. 그것을 시작하고 실행하려면 확실히 약간의 코드가 필요합니다.
zerkms

1
여기를보세요 : github.com/rackt/redux/issues/1287 이 주제에 대한 좋은 토론이 많이 있습니다.
m0meni

1
감사합니다 @ AR7 완벽합니다
l2silver

1
@ l2silver 문제 없습니다. 기본적으로 아이디어는 해당 구성 요소의 색상이 다른 사람에게 중요하지 않은 경우 해당 상태를 구성 요소 자체 내부에 유지하는 것입니다.
m0meni

2
AR7이 언급 한 문제는 이동 : github.com/reactjs/redux/issues/1287
ptim

답변:


156

Redux는 주로 "애플리케이션 상태"를위한 것입니다. 즉, 애플리케이션 로직과 관련된 모든 것입니다. 그 위에 구축 된 뷰는 해당 상태를 반영하지만 모든 작업에 해당 상태 컨테이너를 독점적으로 사용할 필요는 없습니다.

다음 질문을하십시오.이 상태가 나머지 신청서에 중요합니까? 애플리케이션의 다른 부분이 해당 상태에 따라 다르게 작동합니까? 많은 사소한 경우에는 그렇지 않습니다. 드롭 다운 메뉴 가져 오기 : 열려 있거나 닫혀 있다는 사실은 앱의 다른 부분에 영향을 미치지 않을 것입니다. 따라서 매장에 연결하는 것은 아마도 과잉 일 것입니다. 확실히 유효한 옵션이지만 실제로 어떤 이점도 얻을 수는 없습니다. this.state하루를 사용 하고 부르는 것이 좋습니다 .

특정 예에서 버튼이 토글되는 색상이 응용 프로그램의 다른 부분에서 차이를 만들 수 있습니까? 응용 프로그램의 주요 부분에 대한 일종의 전역 켜기 / 끄기 토글이라면 확실히 상점에 속합니다. 그러나 버튼을 클릭 할 때 버튼 색상 만 토글하는 경우 색상 상태를 로컬에서 정의한 상태로 둘 수 있습니다. 버튼을 클릭하는 동작은 동작 전달이 필요한 다른 효과를 가질 수 있지만, 그것은 어떤 색이어야하는지에 대한 간단한 질문과는 별개입니다.

일반적으로 애플리케이션 상태를 가능한 한 작게 유지하십시오. 거기에 모든 것을 넣을 필요는 없습니다 . 필요하거나 거기에 무언가를 유지하는 것이 합리적 일 때 그것을하십시오. 또는 Dev Tools를 사용할 때 삶을 더 쉽게 만들 수 있습니다. 그러나 그 중요성을 너무 많이 과부하시키지 마십시오.


이봐, 난이 질문에 대한 확실한 대답이 없을 것 알고 있지만, 나는 당신의 논리가 매우 소리가 여기 생각
l2silver

3
솔직히 말해서 나는 플럭스 / 리덕스를 전혀 사용하지 않는 것이 무엇인지 이해하지 못한다. 이벤트 기반 모델의 문제점은 무엇입니까?
jayarjo

IMO, 완벽한 답이 아닙니다. 때에 따라 다르지. ui 상태를 반응 상태로 저장하면 redux 저장소가 깨끗해 지지만 테스트하기 어려운 작동하지 않는 구성 요소가됩니다. UI 상태를 반응 상태에 저장하는 동안 추가 리듀서를 작성해야하므로 개발에 많은 노력이 추가됩니다. 그러나 많은 패키지가 당신의 ui 상태를 더 쉽게 redux 저장소로 만들 수 있도록 도와 줄 수 있습니다 . 자세한 내용은 redux.js.org/docs/faq/OrganizingState.html 을 확인 하세요.

19

Redux FAQ : 정리하기
redux 공식 문서의이 부분이 질문에 잘 답했습니다.

로컬 구성 요소 상태를 사용하는 것이 좋습니다. 개발자는 어떤 종류의 상태가 애플리케이션을 구성하고 각 상태가 어디에 있어야하는지 결정하는 것이 귀하의 임무입니다. 자신에게 맞는 균형을 찾아 함께 사용하십시오.

Redux에 어떤 종류의 데이터를 넣어야하는지 결정하기위한 몇 가지 일반적인 경험 규칙 :

  • 애플리케이션의 다른 부분이이 데이터에 관심이 있습니까?
  • 이 원본 데이터를 기반으로 추가 파생 데이터를 생성 할 수 있어야합니까?
  • 여러 구성 요소를 구동하는 데 동일한 데이터가 사용됩니까?
  • 이 상태를 주어진 시점으로 복원 할 수있는 가치가 있습니까 (예 : 시간 여행 디버깅)?
  • 데이터를 캐시 하시겠습니까 (즉, 다시 요청하는 대신 이미있는 경우 상태를 사용)?

6

@ AR7에서 제공하는 훌륭한 링크를 강조하기 위해, 그 링크가 잠시 뒤로 이동했기 때문에 :

전역 적으로 앱에 중요하지 않고 복잡한 방식으로 변경되지 않는 임시 상태에 React를 사용합니다. 예를 들어, 일부 UI 요소의 토글, 양식 입력 상태. 전역 적으로 중요하거나 복잡한 방식으로 변형 된 상태에 Redux를 사용합니다. 예를 들어, 캐시 된 사용자 또는 게시물 초안입니다.

때로는 Redux 상태에서 React 상태 (Redux에 무언가를 저장하는 것이 어색 해짐)로 이동하거나 그 반대 (더 많은 구성 요소가 로컬이었던 상태에 액세스해야하는 경우)를 원할 것입니다.

경험의 법칙은 : 덜 어색한 일을하는 것입니다.

Dan Abramov : https://github.com/reactjs/redux/issues/1287#issuecomment-175351978


-8

예, 모든 구성 요소 상태를 Redux저장하는 것이 좋습니다. 그렇게하면 시간 여행 디버깅 및 재생 가능한 버그 보고서와 같은 Redux의 많은 기능을 활용할 수 있습니다. 그렇지 않으면 해당 기능을 완전히 사용 하지 못할 수 있습니다 .

Redux에 구성 요소 상태 변경을 저장 하지 않을 때마다 해당 변경 사항은 Redux 변경 스택에서 완전히 손실되고 애플리케이션 UI가 저장소와 동기화되지 않습니다. 이것이 중요하지 않다면 왜 Redux를 사용하는지 스스로에게 물어보십시오. 그것 없이는 응용 프로그램이 덜 복잡해질 것입니다!

성능상의 이유로 this.setState()많은 작업을 반복적으로 전달하는 모든 항목 으로 대체 할 수 있습니다 . 예 : 사용자가 키를 입력 할 때마다 입력 필드의 상태를 Redux에 저장하면 성능이 저하 될 수 있습니다. 이를 트랜잭션처럼 처리하여 해결할 수 있습니다. 사용자 작업이 "커밋"되면 Redux에 최종 상태를 저장합니다.

귀하의 원래 게시물은 Redux 방식이 어떻게 "작성해야 할 코드가 엄청나게 많은지"언급하고 있습니다. 예.하지만 로컬 구성 요소 상태와 같은 일반적인 패턴에 추상화를 사용할 수 있습니다.


개선 된 디버깅은 유용한 목표이자 redux의 좋은 기능이지만 신호 대 잡음비도 중요하다고 생각합니다. 코드베이스의 모든 변수를 기록 할 수는 있지만 많은 추가 코드가 추가되어 실제 코드를 읽기 어렵고 로깅을 추적하기가 어렵습니다. redux를 사용할 때도 마찬가지라고 생각합니다. redux에 모든 상태가 있으면 디버깅을 향상시킬 수 있지만 코드를 읽기 어렵게 만들고 일부 디버깅 작업을 더 어렵게 만들 수있는 추가 코드 및 추상화 비용이 있습니다. 합니다 (REDUX의 개발 도구가 충돌 할 때, 디버깅 이익의 대부분은 손실됩니다.)
JD Sandifer에게

1
그렇다면 왜 Redux를 사용합니까? Redux에 모든 것을 넣지 않으면 devtools와 같은 모든 기능을 잃게됩니다. 정말 전부 아니면 아무것도 아닙니다. 이 게시물의 최상위 답변과 같은 드롭 다운 메뉴에 setState ()를 사용하는 경우 devtools를 사용하여 사용자가 드롭 다운 메뉴에서 발생할 수있는 문제를 디버깅 할 수 없습니다. 오버레이가 표시되기 전후에 시간을 이동할 방법이 없기 때문에 오버레이에 setState ()를 사용하면 더 나쁩니다. 여기에 setState ()를 뿌리면 개발자가 무엇이 깨질 지 끊임없이 생각해야하기 때문에 오류가 발생하기 쉽습니다.
kumar303

좀 더 구체적인 답변으로 코드베이스의 모든 변수를 로깅하는 것은 this.setState()또는 을 사용할지 여부에 대한 질문이므로 유용한 은유가 아닙니다 dispatch(action...). 어느 this.setState()곳에서나 사용할 필요는 없지만 필요한 경우 99 %의 경우 대신 Redux를 사용 this.setState()하고 성능 문제에 따라 1 %로 돌아가는 것이 좋습니다.
kumar303

모든 변수를 로깅하는 것은 모든 것을 Redux에 넣는 것과 유사하며 일반적인 규칙으로 똑같이 바람직하지 않습니다. 돌아 오는 중 몇 가지를두면 모두를위한 기능을 부정하지 않는 것입니다 긴 상태가 분리로 돌아 오는에 있습니다. 즉, 선택 상자의 상태가 아닌 경우에도 Redux를 통해 파이프 된 API 호출 로직을 디버깅 할 수 있습니다. OP에는 요점이 있습니다. Redux를 사용하려면 여러 위치에 더 많은 코드가 필요하며 나열된 특정 예제에서 정당화되지 않을 수 있습니다.
JD Sandifer

실제로 API 로직을 디버깅하지 못할 수도 있습니다. 그게 내 요점입니다. 시간 여행을 중단 할 시나리오를 예측하는 것은 정말 어렵 기 때문에 성능 문제가 발생할 때까지 모든 상태 (선택 상자 상태 포함)를 Redux에 두는 것이 좋습니다.
kumar303
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.