react-native-lifecycle

开发过程中发现对React Native生命周期的理解还不够完整,导致渲染的时候性能出现问题,所以写了个例子观察了一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/


import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native';
import ChildComponent from './child';
export default class Parent extends Component {
constructor(props) {
super(props);
this.state = {
content:'content'
};
}

componentDidMount(){
console.log('Parent====componentDidMount')
}

render() {
console.log('Parent====render')
return (
<View style={styles.container}>
<Text style={styles.welcome}>
{this.state.content}
</Text>
<ChildComponent content={this.state.content}/>
<Text style={{margin:20}} onPress={()=>{this.onPress()}}>Press Me!</Text>
<Text style={{margin:20}} onPress={()=>{this.onPressME()}}>Press!</Text>
</View>
);

}

onPress(){
this.setState({content:'React Native Props'});
}

onPressME(){
this.setState({content:'React Native'});
}
}

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/


import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native';

export default class Child extends Component {
constructor(props) {
super(props);
this.state = {
content:this.props.content
};
}

componentWillMount(){
console.log('child====componentWillMount')
}

//先调用子组件的 componentDidMount(),然后调用父组件的函数
componentDidMount(){
console.log('child====componentDidMount')
}

//1.父组件触发render后触发子组件该方法,不管属性是否改变;
//2.这里setState不会触发额外的render()
componentWillReceiveProps(nextProps){
console.log(this.props.content+'===='+'componentWillReceiveProps'+'====='+nextProps.content)
this.setState({content:'componentWillReceiveProps'});


}

shouldComponentUpdate(nextProps,nextState){
console.log('shouldComponentUpdate')
return true
}

// 这个函数调用之后,就会把 nextProps 和 nextState 分别设置到 this.props 和 this.state 中
componentWillUpdate(nextProps,nextState){
console.log('componentWillUpdate')
}

render() {
console.log('child render')
return (
<View style={styles.container}>
<Text style={styles.welcome}>
{this.props.content}
</Text>
<Text style={styles.instructions}>
To get started, edit index.android.js
</Text>
</View>
);

}

componentDidUpdate(prevProps,prevState){
console.log(prevProps.content+'===='+'componentDidUpdate'+'====='+this.props.content)
}
}

const styles = StyleSheet.create({
container: {

justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
第一次加载:
parent.js:28 Parent====render
child.js:24 child====componentWillMount
child.js:52 child render
child.js:29 child====componentDidMount
parent.js:24 Parent====componentDidMount

点击Press Me!:
parent.js:28 Parent====render
child.js:35 content====componentWillReceiveProps=====React Native Props
child.js:42 shouldComponentUpdate
child.js:48 componentWillUpdate
child.js:52 child render
child.js:66 content====componentDidUpdate=====React Native Props

再次点击Press Me:
parent.js:28 Parent====render
child.js:35 React Native Props====componentWillReceiveProps=====React Native Props
child.js:42 shouldComponentUpdate
child.js:48 componentWillUpdate
child.js:52 child render
child.js:66 React Native Props====componentDidUpdate=====React Native Props

点击Press!:
parent.js:28 Parent====render
child.js:35 React Native Props====componentWillReceiveProps=====React Native
child.js:42 shouldComponentUpdate
child.js:48 componentWillUpdate
child.js:52 child render
child.js:66 React Native Props====componentDidUpdate=====React Native