总结
我在成长过程中也是一路摸爬滚打,没有任何人的指点,所以走的很艰难。例如在大三的时候,如果有个学长可以阶段性的指点一二,如果有已经工作的师兄可以告诉我工作上需要什么,我应该前面的三年可以缩短一半;后来去面试bat,失败了有5、6次,每次也不知道具体是什么原因,都是靠面试回忆去猜测可能是哪方面的问题,回来学习和完善,当你真正去招人的时候,你就会知道面试记录是多么重要,面试官可以从面试记录里看到你的成长,总是去面试,总是没有成长,就会被定义为缺乏潜力。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
render()
(2)基本介绍
render
是一个组件必须有的方法,用于界面渲染。
这个函数无参数,返回 JSX
或者其他组件来构成 DOM
。
注意:只能返回一个顶级元素。
componentDidMount
在组件第一次绘制之后,会调用 componentDidMount()
,通知组件已经加载完成。函数原型如下:
void componentDidMount()
这个函数调用的时候,其虚拟 DOM
已经构建完成,你可以在这个函数开始获取其中的元素或者子组件。需要注意的是,RN 框架是先调用子组件的 componentDidMount()
,然后调用父组件的函数。从这个函数开始,就可以和 JS 其他框架交互了,例如设置计时 setTimeout
或者 setInterval
,或者发起网络请求。这个函数也是只被调用一次。这个函数之后,就进入了稳定运行状态,等待事件触发。
(2)基本介绍
- 在组件的生命周期中,这个函数只会被执行一次。
- 这个函数无参数并且不需要任何返回值。
- 它在初始渲染执行完成后会马上被调用。在组件生命周期的这个时间点之后,开发者可以通过子组件的引用来访问、操作任何子组件。
- 如果子组件也有
componentDidMount
函数,它会在父组件的componentDidMount
函数之前被调用。
(3)常见用途
如果 React Native
应用需要在程序启动并显示初始界面后从网络侧获取数据,那么把从网络侧获取数据的代码放在这个函数里是一个不错的选择。
componentWillReceiveProps
如果组件收到新的属性(props
),就会调用 componentWillReceiveProps()
,其原型如下:
void componentWillReceiveProps(
object nextProps
)
输入参数 nextProps
是即将被设置的属性,旧的属性还是可以通过 this.props
来获取。在这个回调函数里面,可以根据属性变化,通过调用 this.setState()
来更新组件状态,这里调用更新状态是安全的,并不会触发额外的 render()
调用。如下:
componentWillReceiveProps: function(nextProps) {
this.setState({
likesIncreasing: nextProps.likeCount > this.props.likeCount
});
}
(2)基本介绍
- 组件的初始渲染执行完成后,当组件接收到新的
props
时,这个函数将被调用。- 这个函数不需要返回值。接收一个
object
参数,object
里是新的props
。- 如果新的
props
会导致界面重新渲染,这个函数将在渲染前被执行。在这个函数中,老的props
可以通过this.props
访问,新的props
在传入的object
中。- 如果在这个函数中通过调用
this.setState
函数改变某些状态机变量的值,React Native
框架不会执行对这些状态机变量改变的渲染,而是等componentWillReceiveProps
函数执行完成后一起渲染。
注意: 当
React Native
初次被渲染时,componentWillReceiveProps
函数并不会被触发,这种机制是故意设计的。
shouldComponentUpdate
当组件接收到新的属性和状态改变,都会触发调用 shouldComponentUpdate(...)
,函数原型如下:
boolean shouldComponentUpdate(
object nextProps, object nextState
)
输入参数 nextProps
和上面的 componentWillReceiveProps
函数一样,nextState
表示组件即将更新的状态值。这个函数的返回值决定是否需要更新组件,如果 true
表示需要更新,继续走后面的更新流程。否者,则不更新,直接进入等待状态。
默认情况下,这个函数永远返回 true
用来保证数据变化的时候 UI
能够同步更新。在大型项目中,可以自己重载这个函数,通过检查变化前后属性和状态,来决定 UI
是否需要更新,有效提高应用性能。
(2)基本介绍
- 组件初始渲染执行完成后,当组件接收到新的
state
或者props
时这个函数将被调用。- 该函数接收两个
object
参数,其中第一个是新的props
,第二个是新的state
。- 该函数需要返回一个布尔值,告诉
React Native
框架针对这次改变,是否需要重新渲染本组件。默认返回true
。如果此函数返回false
,React Native
将不会重新渲染本组件,相应的,该组件的componentWillUpdate
和componentDidUpdate
函数也不会被调用。
(3)常见用途
这个函数常常用来阻止不必要的重新渲染,提高 React Native
应用程序性能。
比如我们可以在该函数中比较新老版本的 state
和 props
,判断是否需要进行重新渲染。下面是一个简单的使用样例:
shouldComponentUpdate(nextProps, nextState) {
if(this.state.inputedNum.length < 3) return false;
return true;
}
componentWillUpdate
如果组件状态或者属性改变,并且上面的 shouldComponentUpdate(...)
返回为 true
,就会开始准更新组件,并调用 componentWillUpdate()
,其函数原型如下:
void componentWillUpdate(
object nextProps, object nextState
)
输入参数与 shouldComponentUpdate
一样,在这个回调中,可以做一些在更新界面之前要做的事情。需要特别注意的是,在这个函数里面,不能使用 this.setState
来修改状态。这个函数调用之后,就会把 nextProps
和 nextState
分别设置到 this.props
和 this.state
中。紧接着这个函数,就会调用 render()
来更新界面。
(2)基本介绍
- 组件初始渲染执行完成后,
React Native
框架在重新渲染该组件前会调用这个函数。- 该函数不需要返回值,接收两个
object
参数,其中第一个是新的props
,第二个是新的state
。- 可以在这个函数中为即将发生的重新渲染做一些准备工作,但不能在这个函数中通过
this.setState
再次改变状态机变量的值。如果需要改变,则在componentWillReceiveProps
函数中进行改变。
componentDidUpdate
调用了 render()
更新完成界面之后,会调用 componentDidUpdate()
来得到通知,其函数原型如下:
void componentDidUpdate(
object prevProps, object prevState
)
到这里,就完成了属性和状态的更新,此函数的输入参数变成了 prevProps
和 prevState
。
基本介绍
- 组件初始渲染执行完成后,
React Native
框架在重新渲染该组件完成后会调用这个函数。- 该函数不需要返回值,接收两个
object
参数,其中第一个是渲染前的props
,第二个是渲染前的state
。
componentWillUnmount
当组件要被从界面上移除的时候,就会调用 componentWillUnmount()
,其函数原型如下:
void componentWillUnmount()
在这个函数中,可以做一些组件相关的清理工作,例如取消计时器、网络请求等。
(2)基本介绍
- 在组件被卸载前,这个函数将被执行。
- 这个函数没有参数,也没不需要返回值。
(3)常见用途
如果组件申请了某些资源或者订阅了某些消息,那么需要在这个函数中释放资源,取消订阅。
三、完整样例
下面通过一个简单的文本显示组件,来演示组件各个环节的运作流程。同时这里把组件整个生命周期中所有会触发的方法罗列出来。
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
TextInput,
View,
Text,
Clipboard
} from 'react-native';
export default class Main extends Component {
//构造函数
constructor(props) {
super(props);
console.log("constructor");
//初始化状态值
this.state = {message: "欢迎访问 hangge.com"}
}
//准备加载组件
componentWillMount() {
console.log("componentWillMount");
}
//渲染界面
render() {
console.log("render");
return (
<View style={styles.container}>
<Text style={styles.info}>
{this.state.message}
</Text>
</View>
);
}
//组件加载成功并渲染出来
componentDidMount() {
console.log("componentDidMount");
}
//组件接收到新的 props 时触发
componentWillReceiveProps(nextProps) {
console.log("componentWillReceiveProps");
}
//决定是否需要更新组件
shouldComponentUpdate(nextProps, nextState) {
console.log("shouldComponentUpdate");
}
//组件重新渲染前会调用
componentWillUpdate(nextProps, nextState) {
console.log("componentWillUpdate");
}
//组件重新渲染后会调用
componentDidUpdate(prevProps, prevState) {
console.log("componentDidUpdate");
}
//组件被卸载前会调用
componentWillUnmount() {
console.log("componentWillUnmount");
}
}
const styles = StyleSheet.create({
container:{
flex:1,
marginTop:40,
alignItems:'center',
},
info:{
fontSize:20,
},
});
AppRegistry.registerComponent('HelloWorld', () => Main);
总结
我在成长过程中也是一路摸爬滚打,没有任何人的指点,所以走的很艰难。例如在大三的时候,如果有个学长可以阶段性的指点一二,如果有已经工作的师兄可以告诉我工作上需要什么,我应该前面的三年可以缩短一半;后来去面试bat,失败了有5、6次,每次也不知道具体是什么原因,都是靠面试回忆去猜测可能是哪方面的问题,回来学习和完善,当你真正去招人的时候,你就会知道面试记录是多么重要,面试官可以从面试记录里看到你的成长,总是去面试,总是没有成长,就会被定义为缺乏潜力。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
什么,我应该前面的三年可以缩短一半;后来去面试bat,失败了有5、6次,每次也不知道具体是什么原因,都是靠面试回忆去猜测可能是哪方面的问题,回来学习和完善,当你真正去招人的时候,你就会知道面试记录是多么重要,面试官可以从面试记录里看到你的成长,总是去面试,总是没有成长,就会被定义为缺乏潜力。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
[外链图片转存中…(img-dQ2zMUj9-1715794668744)]
[外链图片转存中…(img-fKYavpR2-1715794668745)]