1.几个重要概念理解
- 模块与组件
- 模块
- 理解:向外提供特定(局部)功能的js程序,一般就是一个js文件
- 为什么:js代码更多更复杂
- 作用:复用js,简化js的编写,提高js运行效率
- 组件
- 理解:用来实现特定功能效果的代码集合(html/css/js)
- 为什么:一个界面的功能更复杂
- 作用:复用编码,简化项目编码,提高运行效率
- 模块
- 模块化与组件化
- 模块化:
- 当应用的js都以模块来编写的,这个应用就是一个模块化的应用
- 组件化:
- 当应用是以多组件的方式实现功能,这个应用就是一个组件化的应用
- 模块化:
2.React的基本认识
-
Facebook开源的一个js库
-
一个用来动态构建用户界面的js库
-
React的特点
- declarative(声明式编码)
- Component-Based (组件化编码)
- Learn Once,Write Anywhere(支持客户端与服务器渲染)
- 高效
- 单向数据流
-
react高效的原因
- 虚拟(virtual)DOM,不总是直接操作DOM(批量更新,减少更新的次数)
- 高效的DOM Diff算法,最小化页面重绘(减小页面更新的区域)
3.使用React
- 导入相关js库文件(react.js,react-dom.js,babel.min.js)
- 编码:
<div id="container"></div> <script type="text/babel"> var aa = 123 ReactDOM.render(<h1>{aa}</h1>, containerDOM); </script>
- notice:
- 标签必须有结束
- 标签的class属性必须改为className属性
- 标签的style属性值必须为:{{color:'red',width:12}}
5.Component:React是面向组件编程的(组件化编码开发)
- 基本理解和使用
- 自定义的标签:组件类(函数)/标签
- 创建组件类
//方式1: 无状态函数(最简洁, 推荐使用) function MyComponent1() { return <h1>自定义组件标题11111</h1>; } //方式2: ES6类语法(复杂组件, 推荐使用) class MyComponent3 extends React.Component { render () { return <h1>自定义组件标题33333</h1>; } } //方式3: ES5老语法(不推荐使用了) var MyComponent2 = React.createClass({ render () { return <h1>自定义组件标题22222</h1>; } });
- 渲染组件标签
ReactDOM.render(<MyComp />, cotainerEle);
- ReactDOM.render()渲染为组件标签的基本流程
- React内部会创建组件实例对象/调用组件函数,得到虚拟DOM对象
- 将虚拟DOM并解析为真实DOM
- 插入到指定的页面元素内部
- props
- 所有组件标签的属性的集合对象
- 给标签指定属性,保存外部数据(可能是一个function)
- 在组件内部读取属性:this.props.propertyName
- 作用:从目标组件外部向组件内部传递数据
- 对props中的属性值进行类型限制和必要性限制
Person.propTypes = {
name: React.PropTypes.string.isRequired,
age: React.PropTypes.number.isRequired
}
- 扩展属性:将对象的所有属性通过props传递
<Person {...person}/>
- 组件的组合
- 组件标签中包含子组件标签
- 拆分组件:拆分界面,抽取界面
- 通过props传递数据
refs
- 组件内包含ref属性的标签元素的集合对象
- 给操作目标标签指定ref属性,作为一个标识
- 在组件内获取标签对象:this.refs.refName(只是得到了标签元素对象)
- 作用:操作组件内部的真实标签dom元素对象
事件处理
- 给标签添加属性:onXXX={this.eventHandler}
- 在组件中添加事件处理方法
eventHandler(event){}
- 使自定义方法中的this为组件对象
- 在constructor()中bind(this)
- 使用箭头函数定义方法(ES6模块化编码时才能使用)
state
- 组件被称为“状态机”,页面的显示是根据组件的state属性的数据来显示
- 初始化指定:
constructor() {
super();
this.state = {
stateName1 : stateValue1,
stateName2 : stateValue2
};
}
- 读取显示:
this.state.stateName1
- 更新状态--->更新界面
this.setState({stateName1:newValue})
实现一个双向绑定的组件
- React是单向数据流
- 需要通过onChange监听手动实现
组件生命周期
- 组件的三个生命周期状态:
- Mount:插入真实DOM
- Update:被重新渲染
- Unmount:被移出真实DOM
生命周期流程:
- 第一次初始化显示
constructor()
componentWillMount() : 将要插入回调
render() : 用于插入虚拟DOM回调
componentDidMount() : 已经插入回调
- 每次更新state
componentWillReceiveProps(): 接收父组件新的属性
componentWillUpdate() : 将要更新回调
render() : 更新(重新渲染)
componentDidUpdate() : 已经更新回调
- 删除组件
ReactDOM.unmountComponentAtNode(document.getElementById('example')); 移除组件
componentWillUnmount() : 组件将要被移除回调
- 常用的方法
render(): 必须重写, 返回一个自定义的虚拟DOM
constructor(): 初始化状态, 绑定this(可以箭头函数代替)
componentDidMount() : 只执行一次, 已经在dom树中, 适合启动/设置一些监听
网友评论