如果你在两个月前问我对React的看法,我很可能这样说: 我的模板在哪里?javascript中的HTML在做些什么疯狂的事情?JSX开起来非常奇怪!快向它开火,消灭它吧! 那是因为我没有理解它. 我发誓,React 无疑是在正确的轨道上, 请听我道来. Good old MVC 在一个交互式应用程序一切罪恶的根源是管理状态。 MVC提出你的模型是检验真理的唯一来源 - 所有的状态住在那里。 最后,用户交互是由控制器,它更新模型抓获。 |
模型发生变化时就要对视图进行渲染
|
Knockout
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// View (a template) < p >First name: < input data-bind = "value: firstName" /></ p > < p >Last name: < input data-bind = "value: lastName" /></ p > < h2 >Hello, < span data-bind = "text: fullName" > </ span >!</ h2 > // ViewModel (diplay data... and logic?) var ViewModel = function(first, last) { this.firstName = ko.observable(first); this.lastName = ko.observable(last); this.fullName = ko.pureComputed(function() { // Knockout tracks dependencies automatically. It knows that fullName depends on firstName and lastName, because these get called when evaluating fullName. return this.firstName() + " " + this.lastName(); }, this); }; |
而这就是了. 不管改变那边的输入值都在让span中发生变化。你从来都不需要写代码将其进行绑定。这多酷啊,呵?
但是等等,模型不是真相的来源么? 这里的视图模型从来获得它的状态呢? 它是怎么知道模型发生了变化的呢? 有趣的问题啊.
Angular
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// View (a template) <div ng-controller= "HelloController as hello" > <label>Name:</label> <input type= "text" ng-model= "hello.firstName" > <input type= "text" ng-model= "hello.lastName" > <h1>Hello {{hello.fullName()}}!</h1> </div> // Controller angular.module( 'helloApp' , []) .controller( 'HelloController' , function () { var hello = this ; hello.fullName = function () { return hello.firstName + hello.lastName; }; }); |
从这个示例中,看起来像是控制器有了状态,并且有类似模型的行为 - 或者也许是一个视图模型? 假设模型在其它的地方, 那它是如何保持与控制器的同步的呢?
我的头开始有点儿疼了.
数据绑定的问题
数据绑定在小的例子中运行起来很不错。不过,随着你的应用规模变大,你可能会遇到下面这些问题.
声明的依赖会很快引入循环
|
数据绑定是应重新渲染而生的小技巧
|
1
2
3
4
5
6
|
var Hello = React.createClass({ render: function () { return <div>Hello { this .props.name}</div>; } }); React.render(<Hello name= "World" />, document.getElementById( 'container' )); |
这就是一个React组件的所有API。你必须要有一个渲染方法。复杂吧,呵呵?
OK, 但是 <div> 是什么意思? 那不是 JavaScript 啊! 对了,它就不是.
你的新伙伴,JSX这段代码实际上是用 JSX 写的,它是 JavaScript 的一个超集,包含了用于定义组件的语法。上面的代码会被编译成 JavaScript,因此实际上会变成:
你明白这段对 createElement 调用的代码么? 这些对象组成了虚拟 DOM 的实现。 很简单 : React 首先在内存中对应用的整个结构进行了组装。然后它会把这个结构装换成实际的 DOM 节点并将其插入浏览器的 DOM 中。 OK,但是用这些奇怪的 createElement 函数编写 HTML 的目的是什么呢? |
虚拟的DOM就是快
|
React 将状态映射到 DOM
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
var CommentList = React.createClass({ render: function () { var commentNodes = this .props.data.map( function (comment) { return ( <Comment author={comment.author}> {comment.text} </Comment> ); }); return ( <div className= "commentList" > {commentNodes} </div> ); } }); var CommentBox = React.createClass({ render: function () { return ( <div className= "commentBox" > <h1>Comments</h1> <CommentList data={ this .props.data} /> </div> ); } }); React.render( <CommentBox data={data} />, document.getElementById( 'content' ) ); |
今天就开始使用 React
React 一开始会有点令人生畏。它提出了一个实在是太大了点的模式转变,这总有点令人不舒服。不过,当你开始使用它时其优势会变得清楚起来。
React 文档很优秀. 你应该照着教程对其进行一下尝试。我确信如果你给它一个机会,你肯定会爱上她。
编码快乐!
本文转自:开源中国社区 [http://www.oschina.net]
本文标题:我是怎样克服对 React 的恐惧,然后爱上 React 的
本文地址:http://www.oschina.net/translate/how-i-learned-to-stop-worrying-and-love-react
参与翻译:leoxu, AaronW
英文原文:How I learned to stop worrying and love React