Redux @connect dekoratördeki '@' (sembolde) nedir?


226

React ile Redux öğreniyorum ve bu kod üzerine tökezledi. Redux'a özgü olup olmadığından emin değilim, ancak örneklerden birinde aşağıdaki kod snippet'ini gördüm.

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

İşlevselliği connectoldukça basit olsa da , daha @önce anlamıyorum connect. Yanılmıyorsam bile bir JavaScript operatörü değil.

Birisi lütfen bunun ne olduğunu ve neden kullanıldığını açıklayabilir mi?

Güncelleme:

Aslında bir kısmı react-reduxbir React bileşenini bir Redux mağazasına bağlamak için kullanılır.


6
Redux'a aşina değilim, ama bir dekoratör gibi görünüyor. medium.com/google-developers/…
Lee

4
Bu yeni JavaScript dünyasında kodun yarısına nasıl baktığınızı ve "dil sözdiziminin hangi kısmı budur?"
MK.

4
Lol, şimdi redux ve diğer şeylerin derinindeyim. Ama o zamanlar dekoratör sözdiziminin redux ile ilgisi olmadığını bilmiyordum. Sadece JavaScript. Bu sorunun benim gibi birçok insana yardım ettiğini görmekten memnunum. :)
Salman

1
Görünüşe göre redux ekibi şu anda bir dekoratör olarak bağlantı kullanımını engelliyor github.com/happypoulp/redux-tutorial/issues/87
Syed Jafri

Yanıtlar:


376

@Sembol aslında bir JavaScript ifadesidir anda delalet önerdi dekoratörler :

Dekoratörler, tasarım zamanında sınıflara ve özelliklere açıklama eklemeyi ve değiştirmeyi mümkün kılar.

İşte Redux'u dekoratör olmadan ve dekoratörle kurmanın bir örneği:

Dekoratör olmadan

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

Dekoratör kullanma

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
}

Yukarıdaki her iki örnek de eşdeğerdir, sadece bir tercih meselesidir. Ayrıca, dekoratör sözdizimi henüz herhangi bir Javascript çalışma zamanına dahil değildir ve hala deneysel ve değişime tabidir. Kullanmak istiyorsanız, Babel'i kullanabilirsiniz .


46
this is awesome
svnm

2
ES6 sözdizimi ile daha da keskin olabilir. @connect (state => {return {todos: state.todos};}, dispatch => {return {actions: bindActionCreators (actionCreators, dispatch)};})
LessQuesar

11
Gerçekten kısa olmak istiyorsanız ES6'da örtük dönüşler kullanabilirsiniz. Ne kadar açık olmak istediğinize bağlıdır. @connect(state => ({todos: state.todos}), dispatch => ({actions: bindActionCreators(actionCreators, dispatch)}))
Tanner Semerad

3
Bağlantısız bileşeni birim testi için nasıl dışa aktarırsınız?
tim

Redüktör için tepki-navigasyon ile dekoratör kullanmak sorunlu olabilir, mevcut en iyi uygulama dekoratör değil işlevi kullanmaktır: github.com/react-community/react-navigation/issues/1180
straya 23:07

50

Çok önemli!

Bu sahne durum durum sahne olarak adlandırılır ve normal sahne farklıdır, bileşen durum sahne değişiklikleri herhangi bir değişiklik bu sahne kullanmasanız bile bileşen işleme yöntemini tekrar tekrar tetikler, bu nedenle Performans Nedenleri için yalnızca bileşeninize bağlanmaya çalışın bileşeninizin içinde ihtiyaç duyduğunuz durum sahne donanımı ve bir alt sahne kullanıyorsanız yalnızca bu sahne bileşenlerini bağlayın.

örnek: diyelim ki bileşeninizin içinde sadece iki sahne gerekir:

  1. son mesaj
  2. Kullanıcı adı

bunu yapma

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

Bunu yap

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

9
veya yeniden seç veya fastmemoize gibi seçiciler kullanın
Julius Koronci

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.