ใครช่วยอธิบายความแตกต่างระหว่าง Reacts one-way data binding กับ Angular's two-way Binding


109

ฉันค่อนข้างคลุมเครือกับแนวคิดเหล่านี้หากฉันสร้างแอป ToDo เดียวกันอย่างสมบูรณ์ใน AngularJS และ ReactJS - อะไรทำให้ React ToDo ใช้การผูกข้อมูลทางเดียวกับการผูกข้อมูลสองทางของ AngularJS

ฉันเข้าใจว่า React ทำงานแบบนี้

การแสดงผล (ข้อมูล) ---> UI

สิ่งนี้แตกต่างจาก Angular อย่างไร?

คำตอบ:


165

เชิงมุม

เมื่อเชิงมุมตั้งค่าการเชื่อมโยงฐานข้อมูล "ผู้เฝ้าดู" สองคน (นี่คือการทำให้เข้าใจง่าย)

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

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

อินพุตจะเริ่มต้นด้วยtestจากนั้นอัปเดตเป็นanother1000ms การเปลี่ยนแปลงใด ๆ$scope.nameจากโค้ดคอนโทรลเลอร์หรือโดยการเปลี่ยนอินพุตจะแสดงในบันทึกคอนโซล 4000ms ในภายหลัง การเปลี่ยนแปลง<input />จะแสดงใน$scope.nameคุณสมบัติโดยอัตโนมัติเนื่องจากการng-modelตั้งค่าจะเฝ้าดูอินพุตและแจ้ง$scopeการเปลี่ยนแปลง การเปลี่ยนแปลงจากรหัสและการเปลี่ยนแปลงจาก HTML มีสองทางที่มีผลผูกพัน (ตรวจสอบซอนี้ )

ตอบสนอง

การตอบสนองไม่มีกลไกที่อนุญาตให้ HTML เปลี่ยนองค์ประกอบได้ HTML สามารถเพิ่มเหตุการณ์ที่คอมโพเนนต์ตอบสนองเท่านั้น ตัวอย่างทั่วไปคือการใช้onChange.

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

ค่าของ<input />ถูกควบคุมทั้งหมดโดยrenderฟังก์ชั่น วิธีเดียวที่จะปรับปรุงค่านี้มาจากองค์ประกอบของตัวเองซึ่งจะกระทำโดยการแนบonChangeเหตุการณ์ไป<input />ซึ่งชุดที่จะตอบสนองกับวิธีส่วนประกอบthis.state.value ไม่ได้มีการเข้าถึงโดยตรงไปยังรัฐส่วนประกอบและดังนั้นจึงไม่สามารถทำให้เกิดการเปลี่ยนแปลง นี่คือทางเดียวที่มีผลผูกพัน (ตรวจสอบนี้codepen )setState<input />


9
ขอบคุณนี่เป็นข้อมูลที่ดีมาก ดังนั้นฉันเดาว่า Angular ทำงานเหมือน UI <----> ข้อมูลตรงกันข้ามกับ Render's Render (data) ---> UI?
WinchenzoMagnifico

ใช่นั่นเป็นวิธีที่กระชับมาก
Kyeotic

5
ต้องมีความชัดเจนในสิ่งที่แตกต่างเกี่ยวกับข้อมูลที่มีผลผูกพันคือว่ามันไม่อัปเดตสำหรับคุณโดยอัตโนมัติ ในตัวอย่างการตอบสนองข้อมูล UI →ยังคงเกิดขึ้น แต่จะไม่เกิดขึ้นตามค่าเริ่มต้น - คุณต้องตั้งค่าตัวonChangeฟังและเรียกใช้handleChangeด้วยตนเอง แต่จากที่นั่นเนื่องจากการผูกข้อมูลทางเดียวของ React ข้อมูล→การอัปเดต UI จะเกิดขึ้นโดยอัตโนมัติ
Adam Zerner

FYI ซอต้องการการอ้างอิงถึง AngularJS 1.1.1 ฉันเดาว่าการอ้างอิงถึง AngularJS 1.0.1 ไม่ถูกต้องอีกต่อไปกำลังได้รับ 404 การใช้รหัสที่เหมือนกันอย่างผิดปกติในซอใหม่เอี่ยม (ที่มีการอ้างอิง 1.1.1) ล้มเหลว ไม่รู้ว่าเกี่ยวกับอะไร
Josh Sutterfield

194

ฉันวาดรูปเล็กน้อย ฉันหวังว่ามันจะชัดเจนพอ แจ้งให้เราทราบหากไม่ใช่!

การผูกข้อมูล 2 วิธี VS การผูกข้อมูล 1 วิธี


21
'Titre de l'annonce' คืออะไร?
ghd

6
"ชื่อโฆษณา" ในภาษาฝรั่งเศส
timelf123

14
@DamienRoche เท่าที่ฉันเข้าใจแนวคิดนี้ความแตกต่างคือถัดไป: ในการผูกข้อมูลสองทาง: การเปลี่ยนมุมมองการเปลี่ยนแปลงข้อมูลและในทางกลับกัน - การอัปเดตอินพุตภายในมุมมองอัปเดตข้อมูล ระหว่างการรับส่งข้อมูล: การอัปเดตมุมมองการอัปเดตข้อมูล แต่การอัปเดตอินพุตในมุมมองจะไม่อัปเดตข้อมูลเว้นแต่โปรแกรมเมอร์จะดำเนินการอย่างชัดเจนโดยแนบ Listener เข้ากับอินพุตซึ่งจะอัปเดตข้อมูล หวังว่าจะทำให้ชัดเจนขึ้นอีกนิดสำหรับคุณ
Cake_Seller

2
ขอบคุณ @Patrick สำหรับข้อความของคุณ ฉันมีความสุขเสมอที่รู้สึกว่าสิ่งที่ฉันทำมีประโยชน์สำหรับคนอื่น
กาเบรียล

ลิงค์เสีย @Gabriel ช่วยแชร์ภาพในโพสต์ได้ไหม
user3141326

12

การผูกข้อมูลสองทางให้ความสามารถในการรับค่าของคุณสมบัติและแสดงบนมุมมองในขณะเดียวกันก็มีอินพุตเพื่ออัปเดตค่าในโมเดลโดยอัตโนมัติ ตัวอย่างเช่นคุณสามารถแสดงคุณสมบัติ "งาน" บนมุมมองและผูกค่ากล่องข้อความกับคุณสมบัติเดียวกันนั้น ดังนั้นหากผู้ใช้อัปเดตค่าของกล่องข้อความมุมมองจะอัปเดตโดยอัตโนมัติและค่าของพารามิเตอร์นี้จะได้รับการอัปเดตในตัวควบคุมด้วย ในทางตรงกันข้ามการผูกวิธีหนึ่งจะผูกค่าของโมเดลเข้ากับมุมมองเท่านั้นและไม่มีผู้เฝ้าดูเพิ่มเติมเพื่อพิจารณาว่าค่าในมุมมองถูกเปลี่ยนโดยผู้ใช้หรือไม่

เกี่ยวกับ React.js มันไม่ได้ออกแบบมาสำหรับการเชื่อมข้อมูลสองทางจริงๆอย่างไรก็ตามคุณยังสามารถใช้การเชื่อมสองทางด้วยตนเองได้โดยการเพิ่มตรรกะเพิ่มเติมดูตัวอย่างลิงก์นี้ ในการผูกแบบสองทาง Angular.JS เป็นพลเมืองชั้นหนึ่งดังนั้นจึงไม่จำเป็นต้องเพิ่มตรรกะเพิ่มเติมนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.