一篇快速 熟悉 React 生命周期

react

   为了更快的看到效果我在html里面做了个demo,复制就可以看到效果,认真看几次就记住了,熟悉之后就可以在自己的项目中灵活运用 !

React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁  看图

初始化

1、getDefaultProps()

设置默认的props,也可以用dufaultProps设置组件的默认属性.

2、getInitialState()

在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props

3、componentWillMount()

组件初始化时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state。

4、 render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。

5、componentDidMount()

组件渲染之后调用,只调用一次。
更新

6、componentWillReceiveProps(nextProps)

组件初始化时不调用,组件接受新的props时调用。

7、shouldComponentUpdate(nextProps, nextState)

react性能优化非常重要的一环。组件接受新的state或者props时调用,我们可以设置在此对比前后两个props和state是否相同,如果相同则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能,尤其是在dom结构复杂的时候

8、componentWillUpdata(nextProps, nextState)

组件初始化时不调用,只有在组件将要更新时才调用,此时可以修改state

9、render()
组件渲染

10、componentDidUpdate()

组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点。

卸载

11、componentWillUnmount()

组件将要卸载时调用,一些事件监听和定时器需要在此时清除。

下面上代码:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>一篇读懂react生命周期</title>

</head>

<body>

<div id="app"></div>

<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>

<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>

<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

<script type="text/babel">

class Child extends React.Component{

constructor(props){

super(props)

this.state={

message: 'react的生命周期',

date:''

}

}

getDefaultProps(){

console.group('------getDefaultProps 设置默认的props,也可以用dufaultProps设置组件的默认属性.------');

console.log("%c%s", "color:red" , "props : " + this.props); //undefined

}

getInitialState(){

// 在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props

console.group('------getInitialState 在使用es6的class语法时是没有这个钩子函数的------');

console.log("%c%s", "color:red" , "此时可以访问this.props: " + this.props); //undefined

}

componentWillMount(){

console.group('------componentWillMount 在渲染前初始化时只调用一次,在客户端也在服务端,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state ------');

console.log("%c%s", "color:red" , "el : " + this.state.$el); //undefined

console.log("%c%s", "color:red","state : " + this.state); //undefined

console.log("%c%s", "color:red","message: " + this.state.message)

}

// render() 组件渲染

componentDidMount(){

console.group('------componentDidMount 组件渲染之后调用,只调用一次------');

console.log("%c%s", "color:red","message: 组件渲染之后调用,只调用一次" )

}

componentWillReceiveProps(nextProps){

console.group('------componentWillReceiveProps 组件初始化时不调用,组件接受新的props时调用------');

console.log("%c%s", "color:red","nextProps : " ,nextProps)

}

shouldComponentUpdate(nextProps, nextState){

console.group('------shouldComponentUpdate react性能优化非常重要的一环。组件接受新的state或者props时调用,我们可以设置在此对比前后两个props和state是否相同,如果相同则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能,尤其是在dom结构复杂的时候------');

console.log("%c%s", "color:red","nextProps : " , nextProps)

console.log("%c%s", "color:red","nextState : " , nextState)

console.log("%c%s", "color:red","this.props : " , this.props)

// 默认

// return true

// 优化

//旧的message == 新的message

if(nextProps.message == nextState.message){

console.log('前一个对象' + JSON.stringify(nextProps.message)+

'后一个对象' + JSON.stringify(nextState.message));

return false

}

return true

}

componentWillUpdata(nextProps, nextState){

console.group('------componentWillUpdata 组件初始化时不调用,只有在组件将要更新时才调用,此时可以修改state------');

console.log("%c%s", "color:red","nextProps : " , nextProps)

console.log("%c%s", "color:red","nextState : " , nextState)

}

// render() 组件渲染

componentDidUpdate(){

console.group('------componentDidUpdate 组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点------');

}

componentWillUnmount(){

console.group('------componentWillUnmount 组件将要卸载时调用,一些事件监听和定时器需要在此时清除------');

}

Codechanger(event){

this.setState({message:event.target.value});

}

render(){

console.group('------render react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了------');

console.log("%c%s", "color:red","message: 进行diff算法,更新dom树都在此进行。此时就不能更改state了")

// react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。

return(

<div>

<h1>{this.state.message}</h1>

<h1>{this.props.date.toLocaleTimeString()}</h1>

<input type="text" name="text" id="text" value={this.state.message} onChange={this.Codechanger.bind(this)} />

</div>

)

}

}

Index()

//setInterval(Index, 1000);

function Index(){

ReactDOM.render(

<div>

<Child date={new Date()} />,

</div>,

document.getElementById('app'));

}

</script>

</body>

</html>

参考   菜鸟教程   React官方文档

以上是 一篇快速 熟悉 React 生命周期 的全部内容, 来源链接: utcz.com/z/381612.html

回到顶部