2015-09-18 5 views
168

Ich lerne Redux mit React und stolperte über diesen Code. Ich bin mir nicht sicher ob es Redux ist oder nicht, aber ich habe das folgende Code-Snippet in einem der Beispiele gesehen.Was ist das '@' (am Symbol) im Redux @connect Dekorator?

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

Während die Funktionalität von connect ist ziemlich einfach, aber ich verstehe nicht, die @ vor connect. Es ist nicht einmal ein JavaScript-Operator, wenn ich nicht falsch liege.

Kann jemand bitte erklären was ist das und warum wird es benutzt?

Update:

Es ist in der Tat ein Teil von react-redux die verwendet wird, eine zu einem Redux Speicher Reagieren Komponente verbindet.

+6

Ich bin nicht mit Redux vertraut, aber es sieht aus wie ein Dekorateur. https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841 – Lee

+1

Ich liebe, wie in dieser neuen JavaScript Welt, die Sie auf dem Code der Hälfte der Zeit starren und „was Teil der Sprachsyntax zu denken ist das? " –

+3

Lol, ich bin jetzt tief in Redux und Sachen. Aber damals wusste ich nicht, dass die Dekoratorsyntax nichts mit redux zu tun hat. Es ist nur JavaScript. Freut mich zu sehen, dass diese Frage vielen Leuten wie mir hilft. :) –

Antwort

299

Das @ Symbol ist in der Tat ein JavaScript-Ausdruck currently proposed to signify decorators:

Zierer machen es möglich, Klassen und Eigenschaften zur Entwurfszeit mit Anmerkungen versehen und ändern.

Hier ist ein Beispiel von Redux Einrichtung ohne und mit einem Dekorateur:

Ohne Dekorateur

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); 

einen Dekorateur

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 
} 

Beide Beispiele oben verwenden sind gleichwertig, es ist nur ein ma Präferenz. Außerdem ist die Decorator-Syntax noch nicht in Javascript-Laufzeiten eingebaut und ist immer noch experimentell und kann sich ändern. Wenn Sie es verwenden möchten, ist es verfügbar mit Babel.

+34

dieses ehrfürchtigen ist –

+1

One auch mit ES6 Syntax mehr terse sein kann. @connect ( state => { return {todos: state.todos}; }, Versand => { return {Aktionen: bindActionCreators (actionCreators, Versand)}; } ) – LessQuesar

+10

Wenn Sie wirklich wollen Um kurz zu sein, können Sie implizite Renditen in ES6 verwenden. Es hängt davon ab, wie explizit du sein willst. '@connect (state => ({todos: state.todos}), Versand => ({Aktionen: bindActionCreators (actionCreators, Versand)}))' –

22

Sehr wichtig!

Diese Requisiten Zustand Requisiten genannt werden, und sie unterscheiden sich von normalen Requisiten, eine Änderung Ihrer Komponente Zustand Requisiten löst der Komponentenmethode machen immer wieder, auch wenn Sie diese Requisiten nicht so für Performance-Gründen Versuchen Sie, nur die Statusrequisiten, die Sie in Ihrer Komponente benötigen, an Ihre Komponente zu binden, und binden Sie diese Requisiten nur dann, wenn Sie eine Unterrequisite verwenden.

Beispiel: können innerhalb Ihrer Komponente sagen, Sie brauchen nur zwei Requisiten:

  1. die letzte Nachricht
  2. der Benutzername

nicht tun, um diese

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

dies tun

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

oder Verwendung Selektoren wie Neuauswahl oder fastmemoize –

+0

https://survivejs.com/react/appendices/understanding-decorators/ und https://www.sitepoint.com/javascript-decorators-what-they-are/ – zloctb

Verwandte Themen