Quelqu'un peut-il expliquer la différence entre la liaison de données unidirectionnelle Reacts et la liaison de données bidirectionnelle Angular

109

Je suis un peu flou sur ces concepts, si je construis complètement la même application ToDo dans AngularJS et ReactJS --- qu'est-ce qui fait que React ToDo utilise la liaison de données unidirectionnelle par rapport à la liaison de données bidirectionnelle d'AngularJS?

Je comprends que React fonctionne en quelque sorte comme

Rendu (données) ---> UI.

En quoi est-ce différent d'Angular?

WinchenzoMagnifico
la source

Réponses:

165

Angulaire

Lorsque angular met en place une liaison de données, deux "observateurs" existent (c'est une simplification)

//js
$scope.name = 'test';
$timeout(function()  { $scope.name = 'another' }, 1000);
$timeout(function()  { console.log($scope.name); }, 5000);

<!-- html --->
<input ng-model="name" />

L'entrée commencera par test, puis se mettra à jour anotherdans 1000 ms. Toute modification apportée à $scope.name, soit du code du contrôleur, soit en modifiant l'entrée, sera reflétée dans le journal de la console 4000 ms plus tard. Les modifications apportées à la <input />sont $scope.nameautomatiquement reflétées dans la propriété, car les ng-modelparamètres de configuration surveillent l'entrée et notifient $scopeles modifications. Les modifications du code et les modifications du HTML sont une liaison bidirectionnelle . (Regardez ce violon )

Réagir

React n'a pas de mécanisme permettant au HTML de changer le composant. Le HTML ne peut déclencher que des événements auxquels le composant répond. L'exemple typique est en utilisant onChange.

//js
render() { 
    return <input value={this.state.value} onChange={this.handleChange} />
}
handleChange(e) {
    this.setState({value: e.target.value});
}

La valeur de <input />est entièrement contrôlée par la renderfonction. La seule façon de mettre à jour cette valeur est à partir du composant lui-même, ce qui se fait en attachant un onChangeévénement à <input />quel est défini this.state.valueavec la méthode du composant React setState. Le <input />n'a pas d'accès direct à l'état des composants et ne peut donc pas apporter de modifications. Il s'agit d' une liaison à sens unique . (Découvrez ce codepen )

Kyeotic
la source
9
Merci, c'était extrêmement instructif. Donc, je suppose qu'Angular fonctionne plus comme UI <----> Data contrairement à React's Render (data) ---> UI?
WinchenzoMagnifico
Oui, c'est une façon très concise de le dire
Kyeotic
5
Pour être clair, la particularité de la liaison de données est qu'elle effectue automatiquement les mises à jour pour vous . Dans l'exemple React, UI → les données se produisent toujours, c'est juste que cela ne se produit pas par défaut - vous devez configurer manuellement l' onChangeécouteur et l'exécuter handleChange. Mais à partir de là, à cause d'une des données de façon de lier React, les données → mise à jour l' interface utilisateur ne se produisent automatiquement.
Adam Zerner
Pour info, le violon avait besoin d'une référence à AngularJS 1.1.1, je suppose que la référence à AngularJS 1.0.1 n'était plus valide, obtenait un 404. Curieusement, l'utilisation d'un code identique dans un tout nouveau violon (avec une référence 1.1.1) échouait , je ne sais pas de quoi il s'agit.
Josh Sutterfield le
194

J'ai fait un petit dessin. J'espère que c'est assez clair. Faites-moi savoir si ce n'est pas le cas!

Liaison de données à 2 voies VS Liaison de données à 1 voie

Gabriel
la source
21
Qu'est-ce que 'Titre de l'annonce'?
ghd
6
'Titre de l'annonce' en français
timelf123
14
@DamienRoche pour autant que je comprends ce concept, la différence est la suivante: dans les deux sens, la liaison de données: la modification des données change la vue et vice versa - la mise à jour des entrées dans la vue met à jour les données. En cours de flux de données: la mise à jour de la vue des mises à jour des données mais la mise à jour de l'entrée dans la vue ne mettront pas à jour les données à moins que le programmeur ne le fasse explicitement en attachant un auditeur à l'entrée, ce qui mettra à jour les données. J'espère que cela rendra les choses un peu plus claires pour vous.
Cake_Seller
2
Merci, @Patrick pour votre message. Je suis toujours très heureux de sentir que quelque chose que j'ai fait est utile pour les autres
Gabriel
le lien est cassé @Gabriel pourriez-vous partager l'image dans le post?
user3141326
12

La liaison de données bidirectionnelle offre la possibilité de prendre la valeur d'une propriété et de l'afficher sur la vue tout en ayant également une entrée pour mettre à jour automatiquement la valeur dans le modèle. Vous pouvez, par exemple, afficher la propriété "tâche" sur la vue et lier la valeur de la zone de texte à cette même propriété. Ainsi, si l'utilisateur met à jour la valeur de la zone de texte, la vue sera automatiquement mise à jour et la valeur de ce paramètre sera également mise à jour dans le contrôleur. En revanche, la liaison à sens unique lie uniquement la valeur du modèle à la vue et ne dispose pas d'un observateur supplémentaire pour déterminer si la valeur de la vue a été modifiée par l'utilisateur.

En ce qui concerne React.js, il n'a pas été vraiment conçu pour la liaison de données bidirectionnelle, cependant, vous pouvez toujours implémenter la liaison bidirectionnelle manuellement en ajoutant une logique supplémentaire, voir par exemple ce lien . Dans Angular.JS, la liaison bidirectionnelle est un citoyen de première classe, il n'est donc pas nécessaire d'ajouter cette logique supplémentaire.

Alex
la source