前阵子台湾友人推荐我学习React,刚好我自己最近也在接触Gatsby博客。本着技多不压身的思想,所以我打算Vue和React都学。
简单的React应用需要引入2个库。
React和ReactDOM
如果在浏览器端使用,需要引入browser.js提供jsx语法编译支持,并且script的type属性需要设置为
text/babel
。
JSX
ReactDOM要使用JSX
语法来进行编写。
JSX语法可以直接在JS里写HTML内容,不需要加任何引号。
JSX语法基本规则:遇到HTML代码块(以<
开头),就以HTML的规则来解析;遇到JavaScript代码块(以{
开头),就用JavaScript规则进行解析。
JSX语法与原生js语法不兼容。但是它可以通过转译变成原生js。
JSX语法允许在模板内插入JavaScript变量,如果这个变量是一个数组,那么会展开这个数组中的所有成员,添加进模板。
ReactDOM有一个render方法,它接收2个参数,要渲染的内容(JSX语法)和被挂载的位置(原生DOM节点)。用于将模板转化为HTML内容,并且插入到指定的DOM节点。
JSX语法支持使用原生js的一些方法。(原生js返回JSX语法)
JSX语法使用{}
来作为模板语法。
组件
React对象拥有一个createClass
方法,用于创建组件类。创建出的组件类,可以以HTML元素的形式来使用,使用的时候会自动生成一个组件类的实例。
创建出的组件类必须要有一个render
方法,返回一段JSX
格式的内容来进行组件类的输出。
组件类的名称必须大写,组件类返回内容只能包含一个顶层标签,否则会报错。
组件内部可以使用this.props
对象来获取绑定在组件上的属性。
添加属性时候要注意,
class
属性必须写作className
,for
属性必须写作htmlFor
。因为class
和for
是JavaScript中的保留字。
this.props.children
是组件类属性的例外,它表示组件的所有子节点。若无子节点,值为undefined
,若有一个子节点,其数据类型为object
,若有多个子节点,其数据类型为Array
。React提供了一个
React.Children
方法来处理this.props.children
。我们可以使用React.Children.map
来遍历子节点,而无需关心this.props.children
的数据类型。组件类的属性可以为任意类型的值,数字,字符串,对象,数组,函数等都可以。
创建组件类的时候,可以通过设置propTypes
属性来设置我们对每个props属性期待的值的类型。例如:
1 | const HelloWorld = React.createClass({ |
可以通过getDefaultProps
方法来设置组件属性的默认值。
1 | const HelloWorld = React.createClass({ |
组件DOM并非真实的DOM
,而是一种数据结构,叫做虚拟DOM(Virtual DOM),只有将它插入到HTML文档后,才会变为真正的DOM。所有DOM的变动,都是先发生在虚拟DOM上,然后再将真正发生了变化的部分渲染到真实DOM上,这种算法叫做DOM Diff
算法,它可以极大地提高网页地性能表现。
那么如何在React中获取真实DOM呢,这时候我们需要用到ref
属性。
1 | var MyComponent = React.createClass({ |
由于ref属性拿到的是真实DOM,所以必须要在虚拟DOM渲染到文档后才能使用这个属性,否则会报错。使用的时候格式为
this.refs.refName
,绑定事件时候使用模板语法,且onClick
要大写。
组件类的getInitialState
属性用于设置组件内状态的初始值,它会返回一个对象,包含了组件的所有状态,这些状态值可以通过this.state.stateName
来获取。当用户与组件进行了交互或者组件的状态值需要改变时,可以通过setState
方法来修改组件的状态值,修改后它会自动调用组件的render
方法,重新进行组件渲染。
1 | var LikeButton = React.createClass({ |
props常用于定义那些不会改变的状态,而state常用于定义会变化或者存在交互的状态值。
React中不能通过value
直接获取表单的值,而是要通过定义一个onChange
回调,通过event.target.value
来获取常见表单元素的值。
1 | var TextInput = React.createClass({ |
生命周期
组件的生命周期分为三个状态:
- Mounting:已经插入真实DOM
- Updating:正在被重新渲染
- Unmounting:已移出真实DOM
React为每个状态都提供了两种处理函数,will
函数在进入状态之前调用,did
在进入状态之后调用。三种状态共计五种处理函数。
1 | componentWillMount() |
此外React还提供了两种特殊状态的处理函数。
1 | componentWillReceiveProps(object nextProps) // 已加载改组件收到新的参数时调用 |
例子:
1 | var HelloMessage = React.createClass({ |
样式
React组件样式是一个对象,使用的时候要使用如下写法
1 | style={{attrName: attrValue}} // 第一个大括号表示这是js语法 第二个大括号表示样式对象 |