1.1 React简介
- 专注视图层(定位):并不是完整的MVC框架,它专注于提供清晰、简洁的View层解决方案。
- 虚拟节点(优势):DOM操作非常昂贵,而V8引擎极为迅速,Diff算法把真实的DOM树转换成JS对象树。
- 函数式编程(精髓):把不断重复的UI组件抽象成组件,减少冗余代码,并且易于测试。
- 服务端同构(拓展):配合Node后台,渲染出数据再返回给浏览器,实现「学习一次,随处编写」。
1.2 JSX语法
React为方便View层的组件化,承载了构建HTML结构化页面的职责。从这点看,React与其它JavaScript模板引擎有着许多异曲同工指出。但不同的是,React是通过创建与更新虚拟元素来管理整个DOM的。
可是,为什么出现JSX这种东西呢?
1.2.1 DOM元素
描述一个按钮(Button),用HTML语法表示非常简单:1
2
3<button class="blue">
Confirm
</button>
它包括了元素的类型、属性、子元素。如果转换成JSON对象,那么依然要包括这些东西:1
2
3
4
5
6
7
8{
"type": "button",
"props": {
"className": "blue",
"children":"Confirm"
}
}
`
这样,我们就可以在JavaScript中创建Virtual-DOM了。第一滴血已经贡献,接下来我们继续抽象,试着构造一个组件。
1.2.1 组件元素
为了复用这个按钮,我们可以把它封装成一个组件。1
2
3
4
5
6
7
8
9
10
11const Button = (className, text) => {
return {
"type": "button",
"props": {
"className": className,
"children":text
}
}
};
var btn = Button('blue','Confirm');
`
1.2.3 嵌套组件
现在我们有了一个组件,拿它来干点坏事吧,1
2
3
4
5
6
7const DangerButton = ({ text }) => ({
type: Button,
props: {
color: 'red',
children: text
}
});
我们定义了“危险的按钮”这样一种新的组件元素。接着,我们可以很轻松地运用它,继续封装新的组件元素:
1 | const DeleteAccount = () => ({ |
1.2.4 JSX语法
有了这个复合组件,我们已经实现了一个功能模块:提示语+确定按钮+取消按钮。但是如此繁琐,你就不会抓狂?是的,你开始回忆HTML书写结构是畅快淋漓的感受,JSX语法应运而生!1
2
3
4
5
6
7const DeleteAccount = () => (
<div>
<p>Are you sure?</p>
<DangerButton>Confirm</DangerButton>
<Button color="blue">Cancel</Button>
</div>
);