Exemple de code : https://github.com/d6u/example-redux-update-nested-props/blob/master/one-connect/index.js
Voir la démo en direct : http://d6u.github.io/example-redux-update-nested-props/one-connect.html
Comment optimiser les petites mises à jour des props d'un composant imbriqué ?
J'ai les composants ci-dessus, Repo et RepoList. Je veux mettre à jour la balise du premier repo ( Ligne 14 ). J'ai donc envoyé un UPDATE_TAG
action. Avant de mettre en place shouldComponentUpdate
la répartition prend environ 200 ms, ce qui est normal puisque nous perdons beaucoup de temps à différencier les données. <Repo/>
qui n'ont pas changé.
Après avoir ajouté shouldComponentUpdate
L'envoi prend environ 30 ms. Après la mise en production de React.js, les mises à jour ne coûtent que 17 ms environ. C'est beaucoup mieux, mais la vue de la ligne de temps dans la console de développement de Chrome indique toujours une trame jank (plus longue que 16,6 ms).
Imaginez que nous ayons beaucoup de mises à jour comme celle-ci, ou <Repo/>
est plus compliqué que l'actuel, nous ne serons pas en mesure de maintenir 60fps.
Ma question est la suivante : pour de si petites mises à jour des props d'un composant imbriqué, existe-t-il un moyen plus efficace et canonique de mettre à jour le contenu ? Puis-je encore utiliser Redux ?
J'ai trouvé une solution en remplaçant chaque tags
avec un observable dans le réducteur. Quelque chose comme
// inside reducer when handling UPDATE_TAG action
// repos[0].tags of state is already replaced with a Rx.BehaviorSubject
get('repos[0].tags', state).onNext([{
id: 213,
text: 'Node.js'
}]);
Je m'abonne ensuite à leurs valeurs dans le composant Repo à l'aide des éléments suivants https://github.com/jayphelps/react-observable-subscribe . Cela a bien fonctionné. Chaque envoi ne coûte que 5 ms, même avec la version de développement de React.js. Mais j'ai l'impression que c'est un anti-modèle dans Redux.
Mise à jour 1
J'ai suivi la recommandation de la réponse de Dan Abramov et j'ai normalisé mon état et composants de connexion actualisés
La nouvelle forme de l'État est :
{
repoIds: ['1', '2', '3', ...],
reposById: {
'1': {...},
'2': {...}
}
}
J'ai ajouté console.time
autour de ReactDOM.render
à l'heure le rendu initial .
Toutefois, les performances sont moins bonnes qu'auparavant (tant pour le rendu initial que pour la mise à jour). (Source : https://github.com/d6u/example-redux-update-nested-props/blob/master/repo-connect/index.js , Démo en direct : http://d6u.github.io/example-redux-update-nested-props/repo-connect.html )
// With dev build
INITIAL: 520.208ms
DISPATCH: 40.782ms
// With prod build
INITIAL: 138.872ms
DISPATCH: 23.054ms
Je pense que se connecter sur chaque <Repo/>
a beaucoup de frais généraux.
Mise à jour 2
En se basant sur la réponse actualisée de Dan, nous devons retourner connect
's mapStateToProps
renvoient une fonction à la place. Vous pouvez consulter la réponse de Dan. J'ai également mis à jour les démos .
Ci-dessous, les performances sont bien meilleures sur mon ordinateur. Et juste pour le plaisir, j'ai aussi ajouté l'effet secondaire dans l'approche du réducteur dont j'ai parlé ( source , Démonstration ) ( sérieusement, ne l'utilisez pas, c'est seulement pour l'expérience. ).
// in prod build (not average, very small sample)
// one connect at root
INITIAL: 83.789ms
DISPATCH: 17.332ms
// connect at every <Repo/>
INITIAL: 126.557ms
DISPATCH: 22.573ms
// connect at every <Repo/> with memorization
INITIAL: 125.115ms
DISPATCH: 9.784ms
// observables + side effect in reducers (don't use!)
INITIAL: 163.923ms
DISPATCH: 4.383ms
Mise à jour 3
Je viens d'ajouter exemple react-virtualisé basé sur "connecter à tout avec la mémorisation"
INITIAL: 31.878ms
DISPATCH: 4.549ms
1 votes
J'ai modifié ma réponse.
0 votes
Les liens des exemples sont morts :/