Trascorro molto tempo a pensare a come strutturare al meglio le cose nel modo più pulito possibile in React. Ultimamente mi sono bloccato sul fatto che i contenitori React non dovessero fare altro che collegarsi a Redux (o altri dati - a la Meteor) e rendere/restituire un singolo componente, o se anche i contenitori dovrebbero essere responsabili anche della gestione degli eventi . Così, per esempio, è un lancio-up tra questi due modelli:Posso inserire chiamate AJAX nel componente di presentazione o devo estrarre un contenitore?
Modello 1
// ThingContainer.js
import Thing from '../components/Thing';
export default someHigherOrderFunc(/* map state/data to props */)(Thing)
// Thing.js
export default class Thing extends Component {
handleClick() { /* ... */ }
handleMouseEnter() { /* ... */ }
render() {
// Other components rendered here, both container or presentational
}
}
Modello 2
// ThingContainer.js
class ThingContainer extends Component {
handleClick() { /* ... */ }
handleMouseEnter() { /* ... */ }
render() {
// Now Thing can be stateless
return <Thing
onClick={this.handleClick}
onMouseEnter={this.handleMouseEnter}
/>
}
}
export default someHigherOrderFunc()(ThingContainer)
Ci si sente quasi come nel modello 1, Thing
diventa un proprio contenitore in un senso, che non sono sicuro mi piace. Il modello 2 è più naturale, poiché lo ThingContainer
non si occupa solo dei dati e di Redux, ma gestisce anche gli eventi, licenzia le richieste Ajax in componentDidMount
, ecc. Con il primo modello, se volevo una richiesta Ajax da invocare in componentDidMount
, dovrebbe andare in Thing
che non sembra giusto.
Mi chiedo se ci sono particolari vantaggi o insidie a uno di questi approcci, o se si tratta solo di stile/preferenza.
Sembra quasi che tu abbia qualche esperienza con React + Redux;) – markthethomas
Questo ha molto senso! E poi se voglio avere contenitori diversi che possono racchiudere "Cosa", allora si tratta solo di un problema di convenzioni di denominazione (come nominare diverse varianti di 'ThingContainer'). – ffxsam
Sì. Non trovo che il naming sia un problema con casi d'uso reali. Per esempio. 'List' vs' UserFollowerList', 'UserFollowingList',' UserPostList', ecc. –