Je suis un peu flou sur ces concepts, si je construis la même application ToDo complètement dans AngularJS et ReactJS --- ce qui rend le React ToDo utiliser la liaison de données unidirectionnelle par rapport à la liaison de données bidirectionnelle de AngularJS ?
Je comprends que React fonctionne en quelque sorte comme
Rendu (données) ---> UI.
Comment est-ce différent d'angulaire?
Quand angular établit une liaison de données, deux "observateurs" existent (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 commence par test
, puis passe à another
après 1000 ms. Toute modification apportée à $scope.name
, à partir du code du contrôleur ou en modifiant l'entrée, sera reflétée dans le journal de la console 4000 ms plus tard. Les modifications apportées à <input />
sont répercutées automatiquement dans la propriété $scope.name
, car ng-model
configure la surveillance de l'entrée et notifie $scope
des modifications. Les modifications apportées au code et celles apportées au code HTML constituent une liaison bidirectionnelle . (Découvrez ce violon )
React n'a pas de mécanisme permettant au HTML de modifier le composant. Le code HTML peut uniquement déclencher des événements auxquels le composant répond. L'exemple typique est d'utiliser 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 contrôlée entièrement par la fonction render
. Le seul moyen de mettre à jour cette valeur est à partir du composant lui-même, ce qui consiste à attacher un événement onChange
au <input />
qui définit this.state.value
sur avec le composant React méthode setState
. Le <input />
n'a pas d'accès direct à l'état des composants et ne peut donc pas être modifié. Ceci est une liaison à sens unique . (Découvrez ceci codepen )
La liaison de données bidirectionnelle permet de prendre la valeur d’une propriété et de l’afficher dans la vue, tout en disposant d’une entrée permettant de mettre à jour automatiquement la valeur dans le modèle. Vous pouvez, par exemple, afficher la propriété "tâche" dans 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, une liaison à sens unique ne lie que 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’était pas vraiment conçu pour la liaison de données bidirectionnelle. Toutefois, vous pouvez toujours implémenter manuellement la liaison bidirectionnelle en ajoutant une logique supplémentaire, voir par exemple this link . 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.