我对这些概念有点模糊,如果我完全用AngularJS和ReactJS构建相同的ToDo应用程序——是什么让React ToDo使用单向数据绑定而不是AngularJS的双向数据绑定?
我知道React有点像
Render(data) ---> UI.
这和Angular 有什么不同?
我对这些概念有点模糊,如果我完全用AngularJS和ReactJS构建相同的ToDo应用程序——是什么让React ToDo使用单向数据绑定而不是AngularJS的双向数据绑定?
我知道React有点像
Render(data) ---> UI.
这和Angular 有什么不同?
当angular设置数据绑定时,存在两个"观察者"(这是一种简化)
//js
$scope.name = 'test';
$timeout(function() { $scope.name = 'another' }, 1000);
$timeout(function() { console.log($scope.name); }, 5000);
<!-- html --->
<input ng-model="name" />
输入将从test
开始,然后在this fiddle0毫秒内更新到another
.对$scope.name
的任何更改,无论是来自控制器代码还是通过更改输入,都将在4000毫秒后反映在控制台日志(log)中.对<input />
的更改会自动反映在$scope.name
属性中,因为ng-model
设置监视输入,并将更改通知$scope
.代码的更改和HTML的更改是two-way binding.(查看this fiddle)
React没有允许HTML更改组件的机制.HTML只能引发组件响应的事件.典型的例子是使用onChange
.
//js
render() {
return <input value={this.state.value} onChange={this.handleChange} />
}
handleChange(e) {
this.setState({value: e.target.value});
}
<input />
的值由render
功能控制entirely.更新该值的唯一方法是从组件本身,这是通过将onChange
事件附加到<input />
来完成的,<input />
通过react 组件方法setState
将this.state.value
设置为.<input />
无法直接访问组件状态,因此无法进行更改.这是one-way binding.(看看这个codepen)