博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React16.3.0以后的生命周期(二) - 更新、卸载、异常
阅读量:6372 次
发布时间:2019-06-23

本文共 2668 字,大约阅读时间需要 8 分钟。

组件更新

  • static getDerivedStateFromProps()

    当本地state需要根据props来改变的时候可调用此方法。

    这个方法是在render()前会被执行,只要执行render()都会被在之前被触发。

    该方法有两个参数propsstate; 返回值为state对象, 不需要返回整体state,把需要改变的state返回即可。

    示例:

    static getDerivedStateFromProps(props, state) {  if(props.color !== state.color) {    return {color: props.color};  }}
  • shouldComponentUpdate()

    此方法有两个参数:shouldComponentUpdate(nextProps, nextState).

    返回值为true或者false, 默认返回true.

    主要使用它来控制组件要不要渲然,常用作性能优化。

    触发此方法的条件是:组件接收任意props或者state时都会被调用。需要注意的是在第一次render()时和在调用forceUpdate()时都不会被触发。

    示例:

    shouldComponentUpdate(nextProps, nextState) {  if(nextProps.color !== this.props.color || nextState.size !== this.state.size) {    return true;  }   return false;}
  • render()

    这个方法是React组件中必须要提供的方法。当state或者props任一数据有更新时都会执行。

    需要注意当继承
    PureComponent时,不会对对象进行深度比较,也就是,不会根据对象内的对象变化时执行
    render().

    render()是一个纯函数,也就是不能在这个方法中有类似setState()这样的行为。

    返回的数据类型可以有:

    • nullStringNumberArrayBoolean
    • React elements
    • Fragment
    • Portal

      注意:不能返回
      undefined.

shouldComponentUpdate()返回false时,无论stateprops有没有变化,这个方法都不执行。

示例:

render() {      return (        
{this.state.color}
); }
  • getSnapshotBeforeUpdate()

    getSnapshotBeforeUpdate(prevProps, prevState)render将组件渲然到dom中就会执行。

    如果不实现该方法则返回null.

    返回的数据由自己定义,并且返回的数据作为componentDidUpdate方法中的参数。

    示例:

    class ScrollingList extends React.Component {  constructor(props) {    super(props);    this.listRef = React.createRef();  }  getSnapshotBeforeUpdate(prevProps, prevState) {    if (prevProps.list.length < this.props.list.length) {      const list = this.listRef.current;      return list.scrollHeight - list.scrollTop;    }    return null;  }  render() {    return (      
    {/* ...contents... */}
    ); }}
  • componentDidUpdate()

    该方法在组件更新后立即执行,并且在组件挂载阶段不执行。

    componentDidUpdate(prevProps, prevState, snapshot)第三个参数就是上节中提到的。

    示例:

    componentDidUpdate(prevProps, prevState, snapshot) {    if (snapshot !== null) {      const list = this.listRef.current;      list.scrollTop = list.scrollHeight - snapshot;    }  }

组件卸载

  • componentWillUnmount()

    在组件被卸载或者销毁的时候执行,方法中不能再有setState的动作。

    一般用作清除组件中起的定义器、webSocket等。

    示例:

    componentWillUnmount() {  if(this.timer) {    window.clearInterval(this.timer);    this.timer = null;  }}

组件异常处理

  • componentDidCatch()

    componentDidCatch(error, info) 异常的处理。

    只能捕获组件树的异常,无法捕获这个方法内的异常。

    示例:

    定义一下异常处理组件:

    class ErrorBoundary extends React.Component {  constructor(props) {    super(props);    this.state = { hasError: false };  }  componentDidCatch(error, info) {    this.setState({ hasError: true });    window.console.log(error, info);  }  render() {    if (this.state.hasError) {      return 

    Something went wrong.

    ; } return this.props.children; }}

    使用这个异常组件:

推荐阅读

转载地址:http://kiyqa.baihongyu.com/

你可能感兴趣的文章
avalon 的HTML规范
查看>>
iPhone 配置使用工具
查看>>
数据量你造吗-JAVA分页
查看>>
SQL命令优化(积累)
查看>>
CMMI集谈
查看>>
Android 华为U8818真机调试 无法打印Logcat
查看>>
【WP8.1开发】认识后台任务
查看>>
Android中通过导入静态数据库来提高应用第一次的启动速度
查看>>
Namespacing in PHP (php 中使用命名空间)
查看>>
译:在ASP.NET MVC5中如何使用Apache log4net 类库来记录日志
查看>>
GCD之并行串行区别
查看>>
PHP哈希表碰撞攻击
查看>>
linux根目录下文件夹概览
查看>>
深入了解回调函数Java
查看>>
常用的linux系统监控命令
查看>>
Basic Calculator II
查看>>
CorePlot学习
查看>>
数字在排序数组中出现的次数
查看>>
JavaScript权威设计--JavaScript函数(简要学习笔记十一)
查看>>
Chapter 2 User Authentication, Authorization, and Security(3):保server避免暴力袭击
查看>>