书籍完整目录javascript
官方文档html
React 中组件有本身的生命周期方法,简单理解能够为组件从 出生(实例化) -> 激活 -> 销毁 生命周期 hook。经过这些 hook 方法能够自定义组件的特性。 除此以外,还能够设置一些额外的规格配置。java
这些生命周期方法均可以在调用 React.createClass 的参数对象中传入, 咱们已经使用过了一些方法:react
rendergit
getInitialStategithub
getDefaultPropssegmentfault
propTypes数组
类型: array mixins
性能
mixins 能够理解为 React 的插件列表,经过这种模式在不一样组件之间共享方法数据或者行为只需共享 mixin 就行,mixins 内定义的生命周期方法在组件的生命周期内都会被调用。优化
可能的一些疑问:
Q1. 若是组件已经定义了某个生命周期方法, mixin 内也定义了该方法,那么 mixin 内会被调用仍是 组件的会被调用?
Q2. 多个插件都定义了相同生命周期的方法呢?
Q3. 那若是多个插件定义了 getInitialState 这种配置方法呢,有何影响?
插件模式并不是继承的模式,对于问题 一、2 的答案是同样的,都会被调用,调用顺序为 mixins 数组中的顺序。
A1: 都会被调用
A2: 都会被调用
A3: React 会对返回结果作智能的合并,全部插件的 getInitialState 都会生效,前提条件是它们返回的字段不冲突,若是发生字段冲突,React 会提示报错。 同理若是是非 组件的规格方法,出于共享目的的一些方法在多个 mixin 中也不能冲突。
eg:
var MyMixin1 = { componentDidMount: function() { console.log('auto do something when component did mount'); } }; var MyMixin2 = { someMethod: function() { console.log('doSomething'); } }; var MyComponnet = React.createClass({ mixins: [MyMixin1, MyMixin2], componentDidMount: function() { // 调用 mixin1 共享的方法 this.someMethod(); } });
更多 mixins 的使用会在第三章中讲解。
类型: object statics
statics 能够定义组件的类方法
eg:
var MyComponent = React.createClass({ statics: { customMethod: function(foo) { return foo === 'bar'; } } }); MyComponent.customMethod('bar'); // true
React 的组件是 OOP 的思惟,MyComponent 是一个 class,class 分为类方法和实例方法,实例方法能够访问 this, 然而类方法不能,因此咱们不能在 Class 中返回状态或者属性。
类型: string displayName
为了显示调试信息,每一个组件都会有一个名称,JSX 在转为 JS 的时候自动的设置 displayName, 以下:
// Input (JSX): var MyComponent = React.createClass({ }); // Output (JS): var MyComponent = React.createClass({displayName: "MyComponent", });
固然咱们也能够自定义 displayName
下图描述了整个组件的生命周期,包含的主要几种状况:
组件被实例化的时候
组件属性改变的时候
组件状态被改变的时候
组件被销毁的时候
void componentWillMount()
条件:第一次渲染阶段在调用 render 方法前会被调用
做用:该方法在整个组件生命周期只会被调用一次,因此能够利用该方法作一些组件内部的初始化工做
void componentDidMount()
条件:第一次渲染成功事后,组件对应的 DOM 已经添加到页面后调用
做用:这个阶段表示组件对应的 DOM 已经存在,咱们能够在这个时候作一些依赖 DOM 的操做或者其余的一些如请求数据,和第三方库整合的操做。若是嵌套了子组件,子组件会比父组件优先渲染,因此这个时候能够获取子组件对应的 DOM。
void componentWillReceiveProps( object nextProps )
条件: 当组件获取新属性的时候,第一次渲染不会调用
用处: 这个时候能够根据新的属性来修改组件状态
eg:
componentWillReceiveProps: function(nextProps) { this.setState({ likesIncreasing: nextProps.likeCount > this.props.likeCount }); }
注意: 这个时候虽然说是获取新属性,但并不能肯定属性必定改变了,例如一个组件被屡次渲染到 DOM 中,以下面:
var Component = React.createClass({ componentWillReceiveProps: function(nextProps) { console.log('componentWillReceiveProps', nextProps.data.bar); }, rener: function() { return <div> {this.props.data.bar} </div> } }); var container = document.getElementById('container'); var mydata = {bar: 'drinks'}; ReactDOM.render(<Component data={mydata} />, container); ReactDOM.render(<Component data={mydata} />, container); ReactDOM.render(<Component data={mydata} />, container);
结果会输出两次 componentWillReceiveProps,虽然属性数据没有改变,可是仍然会调用 componentWillReceiveProps 方法。
参考 Facebook (A=>B) => (B => A)
boolean shouldComponentUpdate( object nextProps, object nextState )
条件: 接收到新属性或者新状态的时候在 render 前会被调用(除了调用 forceUpdate 和初始化渲染之外)
用处: 该方法让咱们有机会决定是否重渲染组件,若是返回 false,那么不会重渲染组件,借此能够优化应用性能(在组件不少的状况)。
void componentWillUpdate( object nextProps, object nextState )
条件:当组件肯定要更新,在 render 以前调用
用处:这个时候能够肯定必定会更新组件,能够执行更新前的操做
注意:方法中不能使用 setState ,setState 的操做应该在 componentWillReceiveProps 方法中调用
void componentDidUpdate( object prevProps, object prevState )
条件:更新被应用到 DOM 以后
用处:能够执行组件更新事后的操做
咱们知道 React 的核心模式是单向数据流,这不单单是对于组件级别的模式,在组件内部 的生命周期中也是应该符合单向数据的模式。数据从组件的属性流入,再结合组件的状态,流入生命周期方法,直到渲染结束这都应该是一个单向的过程,其间不能随意改变组件的状态。
@todo