Qualcuno può spiegare la differenza tra l'associazione dati unidirezionale di Reacts e l'associazione dati bidirezionale di Angular


109

Sono un po 'confuso su questi concetti, se costruisco la stessa app ToDo completamente in AngularJS e ReactJS --- cosa fa sì che React ToDo usi l'associazione dati unidirezionale rispetto all'associazione dati bidirezionale di AngularJS?

Capisco che React funzioni come

Rendering (dati) ---> UI.

In che modo è diverso da Angular?

Risposte:


165

Angolare

Quando angolare imposta l'associazione dati esistono due "osservatori" (questa è una semplificazione)

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

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

L'ingresso inizierà con test, quindi si aggiornerà a another1000 ms. Eventuali modifiche a $scope.name, dal codice del controller o modificando l'input, verranno riflesse nel registro della console 4000 ms più tardi. Le modifiche a <input />si riflettono $scope.nameautomaticamente nella proprietà, poiché la ng-modelconfigurazione controlla l'input e notifica $scopele modifiche. Le modifiche dal codice e le modifiche dall'HTML sono vincolanti a due vie . (Guarda questo violino )

Reagire

React non ha un meccanismo per consentire all'HTML di cambiare il componente. L'HTML può generare solo eventi a cui il componente risponde. L'esempio tipico è usare onChange.

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

Il valore di <input />è controllato interamente dalla renderfunzione. L'unico modo per aggiornare questo valore è dal componente stesso, che viene fatto allegando un onChangeevento al <input />quale viene impostato this.state.valuecon il metodo del componente React setState. Il <input />non ha accesso diretto allo stato dei componenti e quindi non può apportare modifiche. Questo è unidirezionale . ( Dai un'occhiata a questo codepen )


9
Grazie, è stato estremamente istruttivo. Quindi immagino che Angular funzioni più come UI <----> Data in contrasto con React's Render (data) ---> UI?
WinchenzoMagnifico

Sì, questo è un modo molto conciso per dirlo
Kyeotic

5
Per essere chiari, la cosa distintivo sull'associazione dei dati è che fa gli aggiornamenti per voi automaticamente . Nell'esempio React, l'interfaccia utente → i dati sono ancora presenti, è solo che non accade per impostazione predefinita: devi impostare manualmente l' onChangeascoltatore ed eseguire handleChange. Ma da lì, a causa di di Reagire dati in un modo vincolante, i dati → aggiornamento dell'interfaccia utente fa avvengono automaticamente.
Adam Zerner

Cordiali saluti, il violino aveva bisogno di un riferimento ad AngularJS 1.1.1, immagino che il riferimento ad AngularJS 1.0.1 non fosse più valido, stava ottenendo un 404. Stranamente usare codice identico in un violino nuovo di zecca (con un riferimento 1.1.1) fallisce , non so di cosa si tratta.
Josh Sutterfield

194

Ho fatto un piccolo disegno. Spero sia abbastanza chiaro. Fammi sapere se non lo è!

Associazione dati a 2 vie VS associazione dati a 1 via


21
Cos'è "Titre de l'annonce"?
ghd

6
'Titolo dell'annuncio' in francese
timelf123

14
@DamienRoche per quanto ho capito questo concetto, la differenza è successiva: in due modi di associazione dei dati: la modifica dei dati cambia la vista e viceversa - l'aggiornamento dell'input all'interno della vista aggiorna i dati. Flusso di dati in corso: l'aggiornamento della vista degli aggiornamenti dei dati ma l'aggiornamento dell'input nella vista non aggiornerà i dati a meno che il programmatore non lo faccia esplicitamente allegando l'ascoltatore all'input che aggiornerà i dati. Spero che questo ti renda un po 'più chiaro.
Cake_Seller

2
Grazie, @Patrick per il tuo messaggio. Sono sempre molto felice di sentire qualcosa che ho fatto è utile per gli altri
Gabriel

il collegamento è rotto @ Gabriele potresti condividere l'immagine nel post?
user3141326

12

Il data binding bidirezionale offre la possibilità di prendere il valore di una proprietà e visualizzarlo nella vista, avendo anche un input per aggiornare automaticamente il valore nel modello. È possibile, ad esempio, mostrare la proprietà "task" sulla vista e associare il valore della casella di testo a quella stessa proprietà. Quindi, se l'utente aggiorna il valore della casella di testo, la vista si aggiornerà automaticamente e anche il valore di questo parametro verrà aggiornato nel controller. Al contrario, l'associazione unidirezionale lega solo il valore del modello alla vista e non dispone di un watcher aggiuntivo per determinare se il valore nella vista è stato modificato dall'utente.

Per quanto riguarda React.js, non è stato realmente progettato per il data binding a due vie, tuttavia, puoi comunque implementare manualmente il binding a due vie aggiungendo una logica aggiuntiva, vedi ad esempio questo link . In Angular.JS l'associazione a due vie è un cittadino di prima classe, quindi non è necessario aggiungere questa logica aggiuntiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.