react开发教程(五)生命周期
在组件的整个生命周期中,随着该组件的props或者state发生改变,其DOM表现也会有相应的变化。一个组件就是一个状态机,对于特定地输入,它总返回一致的输出。 一个React组件的生命周期分为三个部分:实例化、存在期和销毁时。 实例化当组件在客户端被实例化,第一次被创建时,以下方法依次被调用:
当组件在服务端被实例化,首次被创建时,以下方法依次被调用: 1、getDefaultProps componentDidMount 不会在服务端被渲染的过程中调用。 getDefaultProps对于每个组件实例来讲,这个方法只会调用一次,该组件类的所有后续应用,getDefaultPops 将不会再被调用,其返回的对象可以用于设置默认的 props(properties的缩写) 值。 getInitialState对于组件的每个实例来说,这个方法的调用有且只有一次,用来初始化每个实例的 state,在这个方法里,可以访问组件的 props。每一个React组件都有自己的 state,其与 props 的区别在于 state只存在组件的内部,props 在所有实例中共享。 getInitialState 和 getDefaultPops 的调用是有区别的,getDefaultPops 是对于组件类来说只调用一次,后续该类的应用都不会被调用,而 getInitialState 是对于每个组件实例来讲都会调用,并且只调一次。 每次修改 state,都会重新渲染组件,实例化后通过 state 更新组件,会依次调用下列方法: 但是不要直接修改 this.state,要通过 this.setState 方法来修改。 componentWillMount该方法在首次渲染之前调用,也是再 render 方法调用之前修改 state 的最后一次机会。 render
render方法返回的结果并不是真正的DOM元素,而是一个虚拟的表现,类似于一个DOM tree的结构的对象。react之所以效率高,就是这个原因。 componentDidMount该方法不会在服务端被渲染的过程中调用。该方法被调用时,已经渲染出真实的 DOM,可以在该方法中通过 this.refs 访问到真实的 DOM。 class App extends Component { static defaultProps = { name:"默认值" } constructor(props) { super(props); this.state = { num : 0 }; this.addNum = this.addNum.bind(this); } addNum(e) { e.preventDefault(); var num = ++this.state.num; this.setState({ num:num }) } componentWillMount() { this.setState({ num:10 }) } render() { return ( <div className="App"> <div className="App-header" ref="header"> <img src={logo} className="App-logo" alt="logo" /> <h2>Welcome to React{this.props.name}</h2> </div> <p className="App-intro"> To get started,edit <code>src/App.js</code> and save to reload. </p> <button onClick={this.addNum}>{this.state.num}</button> </div> ); } componentDidMount() { console.log(this.refs.header) } } 需要注意的是,由于 this.refs.[refName] 属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。 存在期此时组件已经渲染好并且用户可以与它进行交互,比如鼠标点击,手指点按,或者其它的一些事件,导致应用状态的改变,你将会看到下面的方法依次被调用
销毁时componentWillUnmount每当React使用完一个组件,这个组件必须从 DOM 中卸载后被销毁,此时 componentWillUnmout 会被执行,完成所有的清理和销毁工作,在 componentDidMount 中添加的任务都需要再该方法中撤销,如创建的定时器或事件监听器。 当再次装载组件时,以下方法会被依次调用: 1、getInitialState createClass和ES6的不同
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |