Czy ktoś może wyjaśnić różnicę między jednokierunkowym wiązaniem danych Reacts a dwukierunkowym wiązaniem danych Angulara


109

Jestem trochę niejasny w tych koncepcjach, jeśli zbuduję tę samą aplikację ToDo całkowicie w AngularJS i ReactJS - co sprawia, że ​​React ToDo używa jednokierunkowego wiązania danych w porównaniu z dwukierunkowym wiązaniem danych AngularJS?

Rozumiem, że tak działa React

Renderuj (dane) ---> UI.

Czym to się różni od Angulara?

Odpowiedzi:


165

Kątowy

Gdy angular ustawia wiązanie danych, istnieją dwa „obserwatory” (jest to uproszczenie)

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

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

Dane wejściowe będą rozpoczynać się od test, a następnie aktualizować za another1000 ms. Wszelkie zmiany wprowadzone w $scope.namekodzie kontrolera lub w wyniku zmiany danych wejściowych zostaną odzwierciedlone w dzienniku konsoli 4000 ms później. Zmiany wprowadzone <input />we $scope.namewłaściwości są automatycznie odzwierciedlane we właściwości, ponieważ ng-modelkonfigurator śledzi dane wejściowe i powiadamia $scopeo zmianach. Zmiany w kodzie i zmiany w kodzie HTML są dwustronne . (Sprawdź to skrzypce )

Reagować

React nie posiada mechanizmu, który pozwalałby HTML na zmianę komponentu. Kod HTML może zgłaszać tylko zdarzenia, na które odpowiada składnik. Typowym przykładem jest użycie onChange.

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

Wartość <input />jest kontrolowana całkowicie przez renderfunkcję. Jedynym sposobem zaktualizowania tej wartości jest sam komponent, co jest realizowane poprzez dołączenie onChangezdarzenia do <input />atrybutu which this.state.valueprzy użyciu metody komponentu React setState. <input />Nie ma bezpośredniego dostępu do stanu komponentów, a więc nie może dokonać zmian. To jest jednostronne wiązanie . (Sprawdź ten kod )


9
Dzięki, to było niezwykle pouczające. Więc myślę, że Angular działa bardziej jak UI <----> Dane w przeciwieństwie do React's Render (data) ---> UI?
WinchenzoMagnifico

Tak, to bardzo zwięzłe sformułowanie
Kyeotic

5
Dla jasności, cechą wyróżniającą powiązanie danych jest to, że aktualizacje są wykonywane automatycznie . W przykładzie z Reactem, UI → dane nadal się dzieje, po prostu nie dzieje się to domyślnie - musisz ręcznie ustawić onChangenasłuchiwanie i uruchomić handleChange. Ale stamtąd, z powodu jednokierunkowego wiązania danych Reacta, aktualizacja danych → interfejsu użytkownika odbywa się automatycznie.
Adam Zerner,

FYI skrzypce potrzebowały odniesienia do AngularJS 1.1.1, myślę, że odniesienie do AngularJS 1.0.1 nie było już poprawne, otrzymywało 404. Dziwne użycie identycznego kodu w zupełnie nowych skrzypcach (z odniesieniem 1.1.1) zawodzi , nie wiem, o co chodzi.
Josh Sutterfield

194

Zrobiłem mały rysunek. Mam nadzieję, że jest to wystarczająco jasne. Daj mi znać, jeśli tak nie jest!

2 sposoby wiązania danych VS 1-kierunkowe wiązanie danych


21
Co to jest „Titre de l'annonce”?
ghd

6
„Tytuł reklamy” po francusku
timelf123

14
@DamienRoche, o ile rozumiem tę koncepcję, różnica jest następna: dwukierunkowe wiązanie danych: zmiana widoku zmian danych i odwrotnie - aktualizacja danych wejściowych w widoku aktualizuje dane. Przepływ danych w drodze: aktualizowanie widoku aktualizacji danych, ale aktualizowanie danych wejściowych w widoku nie spowoduje aktualizacji danych, chyba że programista zrobi to jawnie, dołączając odbiornik do wejścia, co spowoduje aktualizację danych. Mam nadzieję, że dzięki temu stanie się to dla Ciebie bardziej zrozumiałe.
Cake_Seller

2
Dzięki @Patrick za twoją wiadomość. Zawsze bardzo się cieszę, że coś, co zrobiłem, jest przydatne dla innych
Gabriel,

link jest uszkodzony @Gabriel czy mógłbyś udostępnić zdjęcie w poście?
user3141326

12

Dwukierunkowe powiązanie danych umożliwia pobranie wartości właściwości i wyświetlenie jej w widoku, mając jednocześnie dane wejściowe umożliwiające automatyczne aktualizowanie wartości w modelu. Możesz na przykład pokazać właściwość „zadanie” w widoku i powiązać wartość pola tekstowego z tą samą właściwością. Jeśli więc użytkownik zaktualizuje wartość pola tekstowego, widok zostanie automatycznie zaktualizowany, a wartość tego parametru również zostanie zaktualizowana w kontrolerze. W przeciwieństwie do tego, jednokierunkowe powiązanie wiąże tylko wartość modelu z widokiem i nie ma dodatkowego obserwatora do określenia, czy wartość w widoku została zmieniona przez użytkownika.

Jeśli chodzi o React.js, nie został on tak naprawdę zaprojektowany do dwukierunkowego wiązania danych, jednak nadal można zaimplementować dwukierunkowe wiązanie ręcznie, dodając dodatkową logikę, zobacz na przykład ten link . W Angular.JS dwukierunkowe wiązanie jest obywatelem pierwszej klasy, więc nie ma potrzeby dodawania tej dodatkowej logiki.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.