Redux @connect 데코레이터의 '@'(기호)은 무엇입니까?


226

React로 Redux를 배우고 있으며이 코드를 우연히 발견했습니다. Redux 전용 인지 확실 하지 않지만 예제 중 하나에서 다음 코드 스 니펫을 보았습니다.

@connect((state) => {
  return {
    key: state.a.b
  };
})

의 기능 connect은 매우 간단하지만 @이전을 이해하지 못합니다 connect. 내가 틀리지 않으면 JavaScript 연산자조차 아닙니다.

누군가 이것이 무엇이며 왜 사용되는지 설명해 줄 수 있습니까?

최신 정보:

실제로 react-reduxReact 구성 요소를 Redux 저장소에 연결하는 데 사용되는 부분입니다 .


6
나는 Redux에 익숙하지 않지만 데코레이터처럼 보입니다. medium.com/google-developers/…
Lee

4
저는이 새로운 JavaScript 세계에서 여러분이 절반의 코드를 쳐다보고 "언어 구문의 어떤 부분입니까?"
MK.

4
롤, 나는 지금 redux에 깊이 빠져 있습니다. 그러나 그 당시 나는 데코레이터 구문이 redux와 관련이 없다는 것을 몰랐습니다. 그냥 JavaScript입니다. 이 질문이 저와 같은 많은 사람들을 돕게되어 기쁩니다. :)
Salman

답변:


376

@심볼은 실제로 데코레이터 를 나타 내기 위해 현재 제안 된 JavaScript 표현식 입니다 .

데코레이터를 사용하면 디자인 타임에 클래스와 속성에 주석을 달고 수정할 수 있습니다.

다음은 데코레이터를 사용하거나 사용하지 않고 Redux를 설정하는 예입니다.

데코레이터없이

import React from 'react';
import * as actionCreators from './actionCreators';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';

function mapStateToProps(state) {
  return { todos: state.todos };
}

function mapDispatchToProps(dispatch) {
  return { actions: bindActionCreators(actionCreators, dispatch) };
}

class MyApp extends React.Component {
  // ...define your main app here
}

export default connect(mapStateToProps, mapDispatchToProps)(MyApp);

데코레이터 사용하기

import React from 'react';
import * as actionCreators from './actionCreators';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';

function mapStateToProps(state) {
  return { todos: state.todos };
}

function mapDispatchToProps(dispatch) {
  return { actions: bindActionCreators(actionCreators, dispatch) };
}

@connect(mapStateToProps, mapDispatchToProps)
export default class MyApp extends React.Component {
  // ...define your main app here
}

위의 두 예제는 모두 동일하며 선호의 문제입니다. 또한 데코레이터 구문은 아직 Javascript 런타임에 내장되어 있지 않으며 아직 실험 중이며 변경 될 수 있습니다. 사용하려면 Babel 을 사용하십시오 .


46
이것은 굉장하다
svnm

2
ES6 구문으로 더 간결 할 수도 있습니다. @connect (state => {return {todos : state.todos};}, dispatch => {return {actions : bindActionCreators (actionCreators, dispatch)};})
LessQuesar

11
정말로 간결하고 싶다면 ES6에서 암시 적 반환을 사용할 수 있습니다. 그것은 당신이 얼마나 명백하고 싶어하는지에 달려 있습니다. @connect(state => ({todos: state.todos}), dispatch => ({actions: bindActionCreators(actionCreators, dispatch)}))
Tanner Semerad

3
단위 테스트를 위해 연결되지 않은 구성 요소를 어떻게 내보내겠습니까?
tim

반응 탐색과 함께 redux에 데코레이터를 사용하는 것은 문제가 될 수 있습니다. 현재 가장 좋은 방법은 데코레이터가 아닌 기능을 사용하는 것입니다. github.com/react-community/react-navigation/issues/1180
straya

50

매우 중요!

이 소품은 상태 소품이라고하며 일반 소품과 다릅니다. 구성 요소 상태 소품을 변경하면이 소품을 사용하지 않아도 성능 렌더링 을 위해 구성 요소에만 바인딩하려고 시도해 도 구성 요소 렌더링 방법이 반복적으로 트리거 됩니다 구성 요소 내부에 필요한 상태 소품과 하위 소품을 사용하는 경우 이러한 소품 만 바인딩합니다.

예 : 구성 요소 내부에 소품이 두 개만 있으면됩니다.

  1. 마지막 메시지
  2. 사용자 이름

이러지마

@connect(state => ({ 
   user: state.user,
   messages: state.messages
}))

이 작업을 수행

@connect(state => ({ 
   user_name: state.user.name,
   last_message: state.messages[state.messages.length-1]
}))

9
재 선택 또는 fastmemoize 같은 또는 사용 선택기
줄리어스 Koronci

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.