¿Alguien puede explicar la diferencia entre el enlace de datos unidireccional de Reacts y el enlace de datos bidireccional de Angular?

109

Estoy un poco confuso con estos conceptos, si construyo la misma aplicación ToDo completamente en AngularJS y ReactJS --- ¿qué hace que React ToDo use enlace de datos unidireccional frente al enlace de datos bidireccional de AngularJS?

Entiendo que React funciona como

Render (datos) ---> UI.

¿En qué se diferencia de Angular?

WinchenzoMagnifico
fuente

Respuestas:

165

Angular

Cuando las configuraciones angulares de databinding existen dos "observadores" (esto es una simplificación)

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

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

La entrada comenzará con testy luego se actualizará anotheren 1000ms. Cualquier cambio $scope.name, ya sea desde el código del controlador o cambiando la entrada, se reflejará en el registro de la consola 4000ms más tarde. Los cambios <input />en la $scope.namepropiedad se reflejan automáticamente en la propiedad, ya ng-modelque la configuración vigila la entrada y notifica $scopelos cambios. Los cambios del código y los cambios del HTML son vinculantes bidireccionales . (Mira este violín )

Reaccionar

React no tiene un mecanismo para permitir que el HTML cambie el componente. El HTML solo puede generar eventos a los que responde el componente. El ejemplo típico es el uso de onChange.

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

El valor de <input />está controlado completamente por la renderfunción. La única forma de actualizar este valor es desde el componente en sí, que se realiza adjuntando un onChangeevento al <input />que establece this.state.valuecon el método del componente React setState. El <input />no tiene acceso directo al estado de los componentes, por lo que no puede hacer cambios. Esta es una unión unidireccional . (Mira este codepen )

Kyeotic
fuente
9
Gracias, esto fue extremadamente informativo. Así que supongo que Angular funciona más como UI <----> Data en contraste con Render (data) ---> UI de React.
WinchenzoMagnifico
Sí, esa es una forma muy concisa de decirlo
Kyeotic
5
Para ser claros, lo que distingue al enlace de datos es que realiza las actualizaciones automáticamente . En el ejemplo de reaccionar, la interfaz de usuario → datos todavía están sucediendo, es sólo que no sucede por defecto - que tiene que configurar manualmente el onChangeoyente y de ejecución handleChange. Pero a partir de ahí, debido a los datos de una manera vinculante Reaccionar, los datos → actualización de la interfaz hace suceden de forma automática.
Adam Zerner
Para su información, el violín necesitaba una referencia a AngularJS 1.1.1, supongo que la referencia a AngularJS 1.0.1 ya no era válida, estaba obteniendo un 404. Curiosamente, el uso de código idéntico en un violín nuevo (con una referencia 1.1.1) falla , no sé de qué se trata.
Josh Sutterfield
194

Hice un pequeño dibujo. Espero que esté lo suficientemente claro. ¡Avísame si no es así!

Enlace de datos de 2 vías VS enlace de datos de 1 vía

Gabriel
fuente
21
¿Qué es 'Titre de l'annonce'?
ghd
6
'Título del anuncio' en francés
timelf123
14
@DamienRoche, hasta donde entiendo este concepto, la diferencia es la siguiente: en el enlace de datos bidireccional: cambiar los datos cambia la vista y viceversa: actualizar la entrada dentro de la vista actualiza los datos. Flujo de datos en curso: actualizar la vista de actualizaciones de datos pero actualizar la entrada en la vista no actualizará los datos a menos que el programador lo haga explícitamente adjuntando el oyente a la entrada que actualizará los datos. Espero que le quede un poco más claro.
Cake_Seller
2
Gracias, @Patrick por tu mensaje. Siempre estoy muy feliz de sentir que algo que hice es útil para los demás
Gabriel
el enlace está roto @Gabriel ¿podrías compartir la imagen en la publicación?
user3141326
12

El enlace de datos bidireccional brinda la capacidad de tomar el valor de una propiedad y mostrarlo en la vista al tiempo que tiene una entrada para actualizar automáticamente el valor en el modelo. Por ejemplo, podría mostrar la propiedad "tarea" en la vista y vincular el valor del cuadro de texto a esa misma propiedad. Entonces, si el usuario actualiza el valor del cuadro de texto, la vista se actualizará automáticamente y el valor de este parámetro también se actualizará en el controlador. Por el contrario, la vinculación unidireccional solo vincula el valor del modelo a la vista y no tiene un observador adicional para determinar si el usuario ha cambiado el valor en la vista.

Con respecto a React.js, en realidad no fue diseñado para el enlace de datos bidireccional, sin embargo, aún puede implementar el enlace bidireccional manualmente agregando algo de lógica adicional, consulte, por ejemplo, este enlace . En Angular.JS, el enlace bidireccional es un ciudadano de primera clase, por lo que no es necesario agregar esta lógica adicional.

Alex
fuente