Je suis au milieu de mon premier projet React Native. Je voudrais créer un HOC qui traite uniquement de la synchronisation des données d'une API. Ce serait alors envelopper tous mes autres composants.
Si je suis correct, mon composant DataSync
améliorerait tous les autres composants en procédant comme suit dans la déclaration d'exportation:
export default DataSync(SomeOtherComponent);
Le concept qui me pose problème est que SomeOtherComponent
dépend également de la méthode React Redux Connect pour la récupération des autres états redux. Ma question est comment puis-je utiliser les deux ensemble? Quelque chose comme ça?
export default DataSync(connect(mapStateToProps, mapDispatchToProps)(SomeOtherComponent));
J'ai peut-être complètement mal compris le concept ici, donc j'apprécierais vraiment quelques indications
MODIFIER
Pour expliquer plus loin:
Mon DataSync HOC se chargerait uniquement de la synchronisation des données entre l'application et constituerait le composant de niveau supérieur. Il aurait besoin d'accéder à l'état d'autorisation et définirait les données dans Redux (dans ce cas, les commandes) pour tous les autres composants.
Les composants imbriqués dans le HOC DataSync doivent avoir accès aux données extraites, aux itinéraires, puis créer un état (ordres) qui doit être synchronisé périodiquement avec le serveur.
Peut-être que c'est ce que tu voulais:
DataSync.js
export default connect(mapStateToProps, mapDispatchToProps)(DataSync);
SomeOtherComponent.js
export default DataSync(connect(mapStateToProps, mapDispatchToProps)(SomeOtherComponent));
Utilisez également connect
sur vos composants enfants. Voici POURQUOI
Voici un exemple simple comment cela fonctionne
const AppWrapper = MainComponent =>
class extends Component{
componentWillmount(){
this.props.fetchSomething()
}
componentDidUnmount(){
this.props.Push('/')
}
render(){
return (
<div>
{this.props.fetchedUsers === 'undefined' ?
<div> Do something while users are not fetched </div> :
<MainComponent {...this.props}/>}
</div>
)
}
}
const App = ({users}) => {
// just example, you can do whatever you want
return <div>{JSON.stringify(users)}</div>
};
// mapStateToProps will be in HOC -> Wrapper
// mapDispatchToProps will be in HOC -> Wrapper
/* you may use DataSync as you want*/
export default connect(mapStateToProps, mapDispatchToProps)(AppWrapper(App))
Utile HOC
link
Oui, connect
est également HOC
et vous pouvez les imbriquer de manière arbitraire puisqu'un HOC
renvoie un composant.
HOC(HOC(...(Component)...))
est OK.
Cependant, je pense que ce dont vous pourriez avoir besoin est connect(...)(DataSync(YourComponent))
au lieu de DataSync(connect(...)(YourComponent))
pour que DataSync
puisse également accéder à state
/props
si nécessaire. Cela dépend vraiment du cas d'utilisation.
J'utilise et aime la même approche que celle mentionnée par @ The Reason. Le seul problème ici est que si vous mappez vos actions, dispatch () ne sera pas disponible.
Voici comment j'ai réussi à le faire fonctionner au cas où quelqu'un serait confronté au même problème.
const ConnectedComponentWithActions = connect(
() => { return {}; },
{ myAction },
)(ViewComponent);
export default connect(
state => state,
null,
)(withPreFetch(firstLoadAction, ConnectedComponentWithActions));
Où withPreFetch(firstLoadAction, ConnectedComponentWithActions)
est le HOC acceptant une action à envoyer.