Redux와 반응합니까? '컨텍스트'문제는 어떻습니까?


90

나는 일반적으로 스택에 코드 관련 내용을 게시하지만 이것은 커뮤니티의 일반적인 생각이 무엇인지에 대한 질문에 더 가깝습니다.

데이터 / 상태를 관리하기 위해 React와 함께 Redux를 사용하는 것을 옹호하는 많은 사람들이있는 것 같지만, 둘 다 읽고 배우는 동안 옳지 않은 것을 발견했습니다.

Redux

이 페이지 하단 : http://redux.js.org/docs/basics/UsageWithReact.html (스토어 통과) React 'Context'의 "Magic"사용을 권장합니다.

한 가지 옵션은 모든 컨테이너 구성 요소에 소품으로 전달하는 것입니다. 그러나 구성 요소 트리에서 컨테이너를 렌더링하기 때문에 프레젠테이션 구성 요소를 통해서도 저장을 연결해야하기 때문에 지루합니다.

우리가 권장하는 옵션은 모든 컨테이너 구성 요소에서 저장소를 사용할 수 있도록 마술처럼 호출되는 특수 React Redux 구성 요소를 사용하는 것입니다.

반응

React Context 페이지 ( https://facebook.github.io/react/docs/context.html )에서 상단에 경고가 있습니다.

컨텍스트는 실험적인 고급 기능입니다. API는 향후 릴리스에서 변경 될 수 있습니다.

그런 다음 하단에서 :

명확한 코드를 작성할 때 전역 변수를 피하는 것이 가장 좋은 것처럼, 대부분의 경우 컨텍스트 사용을 피해야합니다.

구성 요소를 통해 모델 데이터를 전달하기 위해 컨텍스트를 사용하지 마십시오. 트리를 통해 데이터를 명시 적으로 스레딩하는 것은 이해하기 훨씬 쉽습니다.

그래서...

Redux는 store'props'를 통해 각 구성 요소로 전달하는 대신 React 'Context'기능을 사용할 것을 권장합니다 . React는 그 반대를 권장합니다.

또한 Dan Abramov (Redux의 창시자)가 이제 Facebook (React의 창시자)에서 일하는 것 같습니다.

  • 내가이 모든 것을 읽고 있는가 ..?
  • 이 문제에 대한 일반적인 합의는 무엇입니까 ..?

8
Ahh 이것은 좋은 질문입니다. 다른 사람들의 견해도 듣고 싶어요! 논의 측면으로 인해 마감 될까봐 조금 두렵습니다. 정말 그렇지 않기를 바랍니다.
mjohnsonengr

답변:


90

컨텍스트는 고급 기능이며 변경 될 수 있습니다. 어떤 경우에는 편의성이 단점보다 중요하므로 React Redux 및 React Router와 같은 일부 라이브러리는 실험적 특성에도 불구하고 이에 의존하기로 선택합니다.

여기서 중요한 부분은 라이브러리 라는 단어 입니다. 컨텍스트가 동작을 변경하면 라이브러리 작성자우리는 . 그러나 라이브러리가 컨텍스트 API를 직접 사용하도록 요청하지 않는 한 사용자는 변경에 대해 걱정할 필요가 없습니다.

React Redux는 내부적으로 컨텍스트를 사용하지만이 사실을 공개 API에 노출하지 않습니다. 따라서 컨텍스트를 직접 사용하는 것보다 React Redux를 통해 사용하는 것이 훨씬 안전하다고 느껴야합니다. 변경되면 코드 업데이트의 부담이 사용자가 아닌 React Redux에 있기 때문입니다.

궁극적으로 React Redux는 항상 소품으로 스토어 전달을 지원하므로 컨텍스트를 완전히 피하려면 그 선택이 있습니다. 그러나 나는 이것이 비현실적이라고 말할 것입니다.

TLDR : 수행중인 작업을 실제로 알지 못하는 경우 컨텍스트를 직접 사용하지 마십시오. 내부적으로 컨텍스트에 의존하는 라이브러리를 사용하는 것은 비교적 안전합니다.


1
잘 말했다. 위험은 React가 향후 릴리스에서 컨텍스트를 모두 제거하면 기존 Redux 앱을 업데이트하기 위해 재 작업이 필요할 수 있다는 것입니다. Redux는 그러한 변화로부터 사용자를 보호 할 수 없을 것입니다. 당신이 지금 페이스 북을 사용하고 있다는 점을 감안할 때, 좋은 소식은 컨텍스트가 사라지면 많은 사전 통지를받을 것으로 기대한다는 것입니다.
Cory House

6
React는 컨텍스트를 제거하지 않습니다. 기술적으로는 가능하지만 존재하는 이유는 FB 내부의 수많은 제품이 필요했기 때문입니다. 따라서 동등한 솔루션이 없으면 사라지지 않습니다. 그러나 정확한 API는 우리가 사용자를 보호하는 것을 변경할 수 있습니다.
Dan Abramov

5
또 다른 중요한 메모는 React가 향후 컨텍스트를 더 적게 사용하는 것보다 더 많이 사용할 계획이라는 것입니다. 우리는 등 유행에 따라 디자인, 애니메이션, 제스처 처리를위한 유용 할 것 같아
댄 아브라모프

그러나 흥미로운 점은 React 컴포넌트 (예 : Material-ui) 라이브러리를 얻을 때 자연스럽게 애플리케이션 상태 모델의 일부를 형성하지 않지만 여전히 동일한 요구 사항을 가진 React 컴포넌트의 트리입니다. 자체 상태 모델과 데이터 흐름을 '주'애플리케이션과 별도로 유지합니다. 따라서 그들은 데이터를 자녀 ​​계층으로 전달하는 유일한 수단으로 컨텍스트 기능을 사용하고 있습니다.
stephenwil

1
@DanAbramov 새로운 컨텍스트 API는 어떻습니까? 여전히 사용하지 않는 것이 좋습니까?
Stanislav Mayorov

4

나는 다른 사람들에 대해 잘 모르지만 react-redux의 connect 데코레이터를 사용하여 구성 요소를 래핑하여 필요한 저장소의 소품 만 구성 요소로 전달하는 것을 선호합니다. 이것은 내가 그것을 소비하지 않기 때문에 어떤 의미에서 컨텍스트의 사용을 정당화합니다 (그리고 원칙적으로 내가 담당하는 코드는 그것을 소비하지 않을 것임을 알고 있습니다).

구성 요소를 테스트 할 때 래핑되지 않은 구성 요소를 테스트합니다. react-redux는 해당 구성 요소에 필요한 소품 만 전달했기 때문에 이제 테스트를 작성할 때 필요한 소품이 무엇인지 정확히 알고 있습니다.

요점은 내 코드에서 문맥이라는 단어를 본 적이없고 소비하지 않기 때문에 어느 정도 영향을 미치지 않는다는 것입니다! 이것은 Facebook의 "실험적"경고에 대해 아무 말도하지 않습니다. 컨텍스트가 사라지면 Redux가 업데이트 될 때까지 다른 모든 사람들처럼 망 쳤을 것입니다.


흥미롭게도 ... 'react-redux'가 모든 Context 항목을 사용 Provider하고 connect추상화 하는 것에 대한 의미를 알았 습니다. Dan Abramov가 현재 FB에 있으면 Context가 Redux를 변경하고 'react-redux'가 업데이트되기를 바랄 것입니다.하지만 보장 할 수는 없지만 FB의 "실험적"경고는 여전히 모두 볼 수 있습니다.
Stephen 지난

나는 FB가 컨텍스트에 어떤 일이 발생하는 경우를 대비하여 react-redux를 루프에 유지하지 않는다면, 나보다 redux에 더 익숙한 곳에서 오픈 소스 기여자가되기를 희망합니다. 그렇지 않다면 내가 알아 내서 직접 할게요!
mjohnsonengr

나는 트위터를 통해 Dan에게 그의 생각을 물었다. 같은 라인을 따라 좋은 대답 ... Context를 사용하는 라이브러리를 사용하고 직접 사용하지 마십시오.
Stephen 마지막

1

반응 컨텍스트에 redux를 정말 쉽게 추가 할 수있는 npm 모듈이 있습니다.

https://github.com/jamrizzi/redux-context-provider

https://www.npmjs.com/package/redux-context-provider

import React, { Component } from 'react';
import ReduxContextProvider from 'redux-context-provider';
import createStore from './createStore';
import actions from './actions';
import Routes from './routes';

export default class App extends Component {
  render() {
    return (
      <ReduxContextProvider store={store} actions={actions}>
        <Routes />
      </ReduxContextProvider>
    );
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.