2016-04-26 21 views
8

Sto costruendo il mio primo React-Redux app e in molti casi ho una scelta di fare <PaginationBox perPage={perPage} /> o avere <PaginationBox /> e poi fareNell'app React/Redux, quando dovrei passare un puntello esplicitamente contro il pick up dallo stato globale usando mapStateToProps?

function mapStateToProps({pagination: {page}}) { 
    return { 
    pageNumber: page + 1 
    }; 
} 

Quali sono le implicazioni di utilizzare un modo o nell'altro e quando devo preferisci uno rispetto all'altro?

Esistono buone pratiche consolidate su come raccogliere oggetti di scena? Mi sento un po 'male ogni volta che uso mapStateToProps in alcuni componenti profondamente annidati perché sembra che il componente si accoppi allo stato di una particolare pagina/app.

+0

Puoi pubblicare un esempio del vostro componenti albero? – Pcriulan

+1

Idealmente i componenti del bambino dovrebbero essere stupidi. Non dovrebbero alterare o avere alcuna influenza su uno stato. Credo che mapStateToProps sarebbe adatto per l'uso a livello di un componente genitore, ma gli oggetti di scena dovrebbero essere passati ai componenti figlio – erichardson30

+0

Suoni come se avessi risposto alla tua stessa domanda. Se è possibile disaccoppiare il componente dallo stato, farlo. Tutti hanno risposto qui https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.c7k4dfcec – azium

risposta

4

Non c'è una sola buona risposta. Per le Domande frequenti su Redux al numero http://redux.js.org/docs/FAQ.html#react-multiple-components, spetta a te decidere dove nella gerarchia dei componenti ha senso collegare un componente. Potrebbe essere al livello "LeftSidebar/RightMainPanel" o potrebbe essere molto più granulare. In alcuni casi, ad esempio tentando di ottimizzare un elenco per le prestazioni, è possibile che l'Elenco stesso sia connesso e recuperi gli ID oggetto e che ogni ListItem sia collegato e recuperi i propri dati per ID.

Per questo caso particolare, probabilmente sarei propendere per avere un <PaginationBox /> essere collegato, e rendere funzionali apolidi <PaginationItem /> componenti, se necessario, per lo più solo perché i singoli elementi non avranno bisogno di alcuna informazione reale allegata diverso da un numero di e un link per fare clic. Ma questa è solo un'opinione.

0

Se vogliamo passare valori/metodi ai componenti figlio, usiamo gli oggetti di scena. I puntelli sono utilizzati per verificare se il valore o il metodo richiesto è disponibile per il componente corrente da qualche altro componente. Supponiamo di avere due metodi uno è l'intestazione di selezione e un altro oggetto d'acquisto. Dall'intestazione di selezione seleziono tutti gli elementi dall'elenco mostrato e invialo al componente buyItems per effettuare l'acquisto. Qui il componente buyItems richiede un valore dall'intestazione di selezione e ciò è obbligatorio. Questo tipo di controllo fatto lancia oggetti di scena.

Invece di usare oggetti di scena, possiamo anche usare i mix. I mixins ci consentono di utilizzare un altro metodo componente nel componente attuale.

var selection-header = React.createClass({ 
     selectItems: function(){ 
     itemsSelectAll: true 
     }, 
     render: function(){ 
     return(
     <BuyItems /> 
     ); 
     } 
    }); 

var BuyItems = React.createClass({ 
     mixins: [selection-header], 
    render: function(){ 
     return(
     ); 
     } 
    }); 

ora nel componente buyitems possiamo usare metodi di intestazione selezione e variabili

+0

I mixin sembrano avere un futuro limitato in React. Ad esempio, non sono compatibili con le classi ES6. Vedi link qui sotto per maggiori informazioni: https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.4odvvoqig https: //facebook.github. io/react/blog/2016/07/13/mixins-considered-harmful.html – ChillyPenguin

2

Avevi già uno sguardo al modello di componenti presentatore/container? Esistono molteplici good article s attorno a questo modello, che si il più delle volte danno una buona idea di quando ad avere una componente presentatore o un contenitore

Il mio consiglio:

Inizia con un componente contenitore (che ha mapStateToProps e mapDispatchToProps) nella parte superiore della gerarchia dei componenti. Qui di seguito i componenti del presentatore che ricevono solo oggetti di scena e azioni. Ci sarà un momento in cui si nota che (A) un componente di presentatore necessita di molte proprietà/azioni o che (B) si passano proprietà/azioni per troppi livelli in basso e solo alcuni di essi vengono afferrati da componenti in mezzo.

poi si inizia a scambiare presentatore con componenti contenitore per grasso componenti (A).Quando ci sono ancora troppe azioni/proprietà passate a (B), è necessario pensare a più componenti del contenitore, che si occupano di evitare passaggi troppo profondi/azioni.

Ma la prima regola potrebbe essere: un componente contenitore in alto, tutti i componenti in basso sono presentatori.

+0

Io uso la stessa soluzione per il mio progetto e ho qualche problema con esso. Più comune è un sacco di codice riscrivibile. Un sacco di mio git si impegna è solo lo scambio di componenti del presentatore con contenitori (e viceversa). Quindi non posso immaginare la struttura di base dell'applicazione all'inizio dello sviluppo. Inoltre ho una domanda sulla denominazione e sulla struttura delle cartelle. Come si chiamano i contenitori (ad esempio, il nome del presentatore è ListItem e il nome del contenitore)? E lo stesso vale per i nomi delle cartelle: mantieni la struttura delle cartelle nella cartella contenitori come nella cartella dei presentatori? – semanser

+1

Hai ragione: molto tempo nello sviluppo di React investirai nel refactoring. È lo stesso per me e per le persone della mia compagnia. Informazioni sulla struttura dei nomi e delle cartelle: quando ho un componente ListItem, di solito tendo ad avere una cartella denominata ListItem con più file. 1x presenter.js, 1x container.js, 1x index.js (punto di ingresso alla cartella da esporre al comando del componente contenitore), 1x spec.js, 1x style.less/css/..., ... Potresti aggiungi anche altri file come: contants.js, service.js per ulteriori funzionalità. La cartella ottiene un modulo stesso con le sue funzionalità, stile, ecc. –

0

Questo argomento è un po 'soggettivo e non ci sono regole rigide. Quindi ti dirò solo quello che faccio.

In genere, provo a connettermi solo al negozio nel contenitore (componente principale, componente intelligente, ecc ...). Quindi passo gli oggetti di scena dal contenitore al componente (componente stupido) che non è collegato al negozio.

Mi sforzo sempre per una gerarchia di Store -> Container -> Puntatori -> Componente.

Detto questo, non sempre ha senso attenersi a quella gerarchia in ogni momento è semplicemente che cerco sempre di fare prima.

Capisco sicuramente cosa si sta dicendo che collegare un componente al negozio che è sepolto nella gerarchia dei componenti può sembrare un po 'sporco, per non dire difficile da mantenere.

Ecco un buon articolo su componenti intelligenti/muti o contenitori/componenti: Smart and dumb components in React