Có ai có thể giải thích sự khác biệt giữa liên kết dữ liệu một chiều của Reacts và liên kết dữ liệu hai chiều của Angular không


109

Tôi hơi mơ hồ về những khái niệm này, Nếu tôi xây dựng cùng một ứng dụng ToDo hoàn toàn trong AngularJS và ReactJS --- điều gì khiến React ToDo sử dụng liên kết dữ liệu một chiều so với liên kết dữ liệu hai chiều của AngularJS?

Tôi hiểu rằng loại React hoạt động như

Kết xuất (dữ liệu) ---> Giao diện người dùng.

Điều này khác với Angular như thế nào?

Câu trả lời:


165

Angular

Khi angle thiết lập databinding tồn tại hai "watchers" (đây là một sự đơn giản hóa)

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

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

Đầu vào sẽ bắt đầu bằng test, sau đó cập nhật lên sau another1000ms. Bất kỳ thay đổi nào đối với $scope.name, từ mã bộ điều khiển hoặc bằng cách thay đổi đầu vào, sẽ được phản ánh trong nhật ký bảng điều khiển 4000ms sau đó. Các thay đổi đối với thuộc <input />tính được phản ánh $scope.nametự động vì ng-modelthiết lập sẽ xem dữ liệu đầu vào và thông báo $scopevề các thay đổi. Các thay đổi từ mã và các thay đổi từ HTML là liên kết hai chiều . (Kiểm tra trò chơi này )

Phản ứng

React không có cơ chế cho phép HTML thay đổi thành phần. HTML chỉ có thể nêu ra các sự kiện mà thành phần phản hồi. Ví dụ điển hình là bằng cách sử dụng onChange.

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

Giá trị của <input />được kiểm soát hoàn toàn bởi renderchức năng. Cách duy nhất để cập nhật giá trị này là từ chính thành phần, được thực hiện bằng cách đính kèm một onChangesự kiện vào sự kiện <input />được đặt this.state.valuevới phương thức thành phần React setState. Các <input />không có quyền truy cập trực tiếp đến tình trạng các thành phần, và vì vậy nó không thể thực hiện thay đổi. Đây là ràng buộc một chiều . (Kiểm tra codepen này )


9
Cảm ơn, điều này rất nhiều thông tin. Vì vậy, tôi đoán Angular hoạt động giống UI <----> Data hơn là Render (data) ---> UI của React?
WinchenzoMagnifico

Có, đó là một cách rất ngắn gọn để đặt nó
Kyeotic

5
Nói rõ hơn, điều khác biệt về ràng buộc dữ liệu là nó tự động cập nhật cho bạn . Trong ví dụ về React, UI → data vẫn đang diễn ra, chỉ là nó không xảy ra theo mặc định - bạn phải thiết lập trình onChangenghe và chạy theo cách thủ công handleChange. Nhưng từ đó, do liên kết dữ liệu một chiều của React, cập nhật dữ liệu → giao diện người dùng sẽ diễn ra tự động.
Adam Zerner

FYI fiddle cần tham chiếu đến AngularJS 1.1.1, tôi đoán tham chiếu tới AngularJS 1.0.1 không còn hợp lệ nữa, nhận được mã 404. Kỳ lạ là sử dụng mã giống hệt trong một fiddle hoàn toàn mới (với tham chiếu 1.1.1) không thành công , không biết đó là về cái gì.
Josh Sutterfield

194

Tôi đã thực hiện một bản vẽ nhỏ. Tôi hy vọng nó đủ rõ ràng. Hãy cho tôi biết nếu nó không phải là!

2 cách liên kết dữ liệu VS 1 cách liên kết dữ liệu


21
'Titre de l'annonce' là gì?
ghd

6
'Tiêu đề quảng cáo' bằng tiếng Pháp
timelf123 14/12/16

14
@DamienRoche theo như tôi hiểu khái niệm này, sự khác biệt tiếp theo là: Theo hai cách ràng buộc dữ liệu: thay đổi dữ liệu thay đổi chế độ xem và ngược lại - cập nhật đầu vào bên trong chế độ xem cập nhật dữ liệu. Trong luồng dữ liệu đang thực hiện: cập nhật chế độ xem cập nhật dữ liệu nhưng cập nhật đầu vào trong chế độ xem sẽ không cập nhật dữ liệu trừ khi lập trình viên thực hiện điều đó một cách rõ ràng bằng cách gắn trình nghe vào đầu vào sẽ cập nhật dữ liệu. Hy vọng rằng sẽ làm cho nó rõ ràng hơn một chút cho bạn.
Cake_Seller 19/06/17

2
Cảm ơn, @Patrick cho tin nhắn của bạn. Tôi luôn rất vui khi cảm thấy điều gì đó tôi đã làm có ích cho người khác
Gabriel

liên kết bị hỏng @Gabriel bạn có thể chia sẻ hình ảnh trong bài viết?
user3141326

12

Liên kết dữ liệu hai chiều cung cấp khả năng lấy giá trị của thuộc tính và hiển thị nó trên dạng xem đồng thời có đầu vào để tự động cập nhật giá trị trong mô hình. Ví dụ: bạn có thể hiển thị thuộc tính "nhiệm vụ" trên dạng xem và liên kết giá trị hộp văn bản với cùng thuộc tính đó. Vì vậy, nếu người dùng cập nhật giá trị của hộp văn bản, chế độ xem sẽ tự động cập nhật và giá trị của tham số này cũng sẽ được cập nhật trong bộ điều khiển. Ngược lại, một cách ràng buộc chỉ ràng buộc giá trị của mô hình với chế độ xem và không có trình theo dõi bổ sung để xác định xem giá trị trong chế độ xem có bị người dùng thay đổi hay không.

Về React.js, nó không thực sự được thiết kế để liên kết dữ liệu hai chiều, tuy nhiên, bạn vẫn có thể triển khai ràng buộc hai chiều theo cách thủ công bằng cách thêm một số logic bổ sung, ví dụ như liên kết này . Trong Angular.JS ràng buộc hai chiều là công dân hạng nhất, vì vậy không cần thêm logic bổ sung này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.