React和Vue生命周期、渲染顺序

这篇具有很好参考价值的文章主要介绍了React和Vue生命周期、渲染顺序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

对比

命名规则

react:componentWillXxx,componentDidXxx

vue2:beforeXxx,xxxed

vue3:onBeforeXxx,onXxxed

生命周期

应用

created(vue2)(此时可访问this,更早地响应):ajax请求

mounted:操作dom(初始化节点、事件监听、副作用、ajax、网络请求)

WillUnmount:清除 timer,取消ajax、网络请求、订阅

渲染顺序

洋葱模型

React

组件挂载:插入 DOM 树

挂载前constructor()

挂载时render()

挂载后componentDidMount()

更新

更新时render():prop/state改变

更新后componentDidUpdate()

卸载

卸载前componentWillUnmount():

React17增删的生命周期

废除的生命周期

componentWillMount

componentWillRecieveProps

componentWIllUpdate

新增的生命周期

getDerivedStateFromProps(nextProps, prevState):用props更新state的过程

替换componentWillReceiveProps:只有当父组件造成重新渲染时才调用

在每次渲染render之前都会调用:返回一个对象表示新的 state;若不需要更新,返回 null 即可

getSnapshotBeforeUpdate(prevProps, prevState):读取最新的DOM数据

替换 componentWillUpdate(update后 DOM 更新前被调用)

返回值将作为 componentDidUpdate(prevProps, prevState, snapshot) 的snapshot

componendDidCatch(error, info):错误边界

常见问题

 setState 更新的值不变,还是会触发生命周期钩子

Vue

初始阶段:beforeCreate、created、beforeMount、mounted

更新阶段:beforeUpdate、updated

销毁阶段:beforeUnmout、unmounted

生命周期

Vue3

使用:先导入

onErrorCaptured监听组件的统一报错:onErrorCaptured(error, component, details)


对比

命名规则

react:componentWillXxx,componentDidXxx

vue2:beforeXxx,xxxed

vue3:onBeforeXxx,onXxxed

生命周期

生命周期 React16 React17 Vue2 Vue3(使用先导入)
初始化 constructor beforeCreate setup
created
componentWillMount beforeMount onBeforeMount
componentDidMount mounted onMounted
更新 componentWIllUpdate getSnapshotBeforeUpdate(prevProps, prevState) beforeUpdate onBeforeUpdate
shouldComponentUpdate,componentDidUpdate

updated

onUpdated
卸载 componentWillUnmount beforeDestroy onBeforeUnmount
destroyed onUnmounted
监听组件的统一报错 componendDidCatch(error, info)错误边界 onErrorCaptured(error, component, details)

应用

created(vue2)(此时可访问this,更早地响应):ajax请求

mounted:操作dom(初始化节点、事件监听、副作用、ajax、网络请求)

WillUnmount:清除 timer,取消ajax、网络请求、订阅

渲染顺序

洋葱模型

React和Vue生命周期、渲染顺序,React和Vue,react.js,vue.js,okhttp

React

生命周期钩子函数就是回调函数

组件挂载:插入 DOM 树

挂载前constructor()

如果不初始化 state 或不进行方法绑定,则不需要为 React 组件实现构造函数

挂载时render()

class 组件中唯一必须实现的方法。

挂载后componentDidMount()

组件(插入 DOM 树中)立即调用。依赖于 DOM 节点的初始化应该放在这里。

更新

更新时render():prop/state改变

它只有在 prop 或state发生变化时才可能更新和重新渲染

更新后componentDidUpdate()

首次渲染不会执行此方法。

卸载

卸载前componentWillUnmount():

class Welcome extends React.Component {
    state = {
        msg: 'hello world'
    }
    constructor(props){
        super(props);
        console.log('constructor');
    }
    componentDidMount = () => {
        // react中发起ajax请求的初始操作,在这个钩子中完成
        console.log('componentDidMount');
    }
    componentDidUpdate = () => {
        // 等DOM更新后触发的钩子
        console.log('componentDidUpdate');
    }
    componentWillUnmount = () => {
        console.log('componentWillUnmount');
    }
    handleClick = () => {  
        /* this.setState({
          msg: 'hi react'
        }); */
        //this.forceUpdate();
        root.unmount();   // 触发卸载组件
    }
    render(){
        console.log('render');
        return (
            <div>
                <button onClick={this.handleClick}>点击</button>
                { this.state.msg }
            </div>
        );
    }
}

React17增删的生命周期

废除的生命周期

React和Vue生命周期、渲染顺序,React和Vue,react.js,vue.js,okhttp

componentWillMount

componentWillRecieveProps

componentWIllUpdate

官网文档指出使用这些生命周期的代码会在未来版本的react中更容易产生bug,尤其是对于异步渲染的版本。由于未来采用异步渲染机制,所以即将在17版本中去掉的生命周期钩子函数

dom 被挂载之前的阶段都可以被打断重来,导致 componentWillMountcomponentWillUpdatecomponentWillReceiveProps 在一次更新中可能会被触发多次,因此那些只希望触发一次的副作用应该放在 componentDidMount

新增的生命周期

React和Vue生命周期、渲染顺序,React和Vue,react.js,vue.js,okhttp

getDerivedStateFromProps(nextProps, prevState):用props更新state的过程

替换componentWillReceiveProps:只有当父组件造成重新渲染时才调用

接收父组件传递过来的 props 和组件之前的状态

每次渲染render之前都会调用:返回一个对象表示新的 state;若不需要更新,返回 null 即可

最常见的误解就是 getDerivedStateFromPropscomponentWillReceiveProps 只会在 props “改变”时才会调用。实际上只要父组件重新渲染时,这两个生命周期函数就会重新调用,不管 props 有没有“变化”

static静态函数:定义在React组件类上的,而非实例上,无法通过this来访问组件的属性或状态,而是可以直接通过组件类本身调用。静态方法通常用于执行与组件实例无关的任务,例如工具函数。

class Form extends Component {
  state = {
    email: this.props.defaultEmail,
    prevUserID: this.props.userID
  };

  static getDerivedStateFromProps(props, state) {
    // Any time the current user changes,
    // Reset any parts of state that are tied to that user.
    // In this simple example, that's just the email.
    if (props.userID !== state.prevUserID) {
      return {
        prevUserID: props.userID,
        email: props.defaultEmail
      };
    }
    return null;
  }

  // ...
}

getSnapshotBeforeUpdate(prevProps, prevState):读取最新的DOM数据

Snapshot[ˈsnæpʃɑːt]:快照

替换 componentWillUpdate(update后 DOM 更新前被调用)
返回值将作为 componentDidUpdate(prevProps, prevState, snapshot) 的snapshot

在更新期间保留其滚动位置的聊天线程

class ScrollingList extends React.Component {
  constructor(props) {
    super(props);
    this.listRef = React.createRef();
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    // Are we adding new items to the list?
    // Capture the scroll position so we can adjust scroll later.
    if (prevProps.list.length < this.props.list.length) {
      const list = this.listRef.current;
      return list.scrollHeight - list.scrollTop;
    }
    return null;
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    // If we have a snapshot value, we've just added new items.
    // Adjust scroll so these new items don't push the old ones out of view.
    // (snapshot here is the value returned from getSnapshotBeforeUpdate)
    if (snapshot !== null) {
      const list = this.listRef.current;
      list.scrollTop = list.scrollHeight - snapshot;
    }
  }

  render() {
    return (
      <div ref={this.listRef}>{/* ...contents... */}</div>
    );
  }
}

componendDidCatch(error, info):错误边界

如果一个组件定义了componentDidCatch生命周期,则他将成为一个错误边界(错误边界会捕捉渲染期间、在生命周期方法中和在它们之下整棵树的构造函数中的错误,

就像使用了try catch,不会将错误直接抛出了,保证应用的可用性

常见问题

 setState 更新的值不变,还是会触发生命周期钩子

Vue

初始阶段:beforeCreate、created、beforeMount、mounted

更新阶段:beforeUpdate、updated

销毁阶段:beforeUnmout、unmounted

React和Vue生命周期、渲染顺序,React和Vue,react.js,vue.js,okhttp

生命周期

Vue3

使用:先导入
// vue3
<script setup>     
import { onMounted } from 'vue';   // 使用前需引入生命周期钩子
 
onMounted(() => {
  // ...
});
 
// 可将不同的逻辑拆开成多个onMounted,依然按顺序执行,不会被覆盖
onMounted(() => {
  // ...
});
</script>
 
// vue2
<script>     
export default {         
  mounted() {   // 直接调用生命周期钩子            
    // ...         
  },           
}
</script> 
onErrorCaptured监听组件的统一报错:onErrorCaptured(error, component, details)
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  methods: {
    throwError() {
      // 人为地抛出一个错误
      throw new Error('An error occurred.');
    }
  },
  onErrorCaptured(error, component, details) {
    console.error('Captured an error in component:', component);
    console.error('Error details:', error);
    console.error('Details:', details);
    // 可以选择返回 false 来阻止错误继续传播
    // return false;
  }
};
</script>

你真的了解 React 生命周期吗 - 掘金

Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子] - 掘金文章来源地址https://www.toymoban.com/news/detail-590515.html

到了这里,关于React和Vue生命周期、渲染顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue页面和组件的生命周期顺序

    想了很久的一个问题  为什么有时候页面传递数据给组件  组件渲染不出来   但是打印生命周期函数 在页面的beforecreate生命周期获取数据 在组件mounted中渲染 理论上来说是没问题的   原来是网络请求需要时间  有可能是没有获取到数据的时候  空数据已经传递给组件了 需

    2024年01月18日
    浏览(40)
  • Vue父子组件生命周期执行顺序是什么?

    执行顺序:父组件先创建,然后子组件创建;子组件先挂载,然后父组件挂载,即“父beforeCreate- 父create - 子beforeCreate- 子created - 子mounted - 父mounted”。 在单一组件中,钩子的执行顺序是beforeCreate- created - mounted-… -destroyed,但当父子组件嵌套时,父组件和子组件各拥有各自独

    2024年02月09日
    浏览(39)
  • Vue生命周期--四大阶段--8个钩子之mounted钩子的渲染

    Vue生命周期 :一个Vue实例从创建到销毁的整个过程。 生命周期四个阶段 :创建(响应式数据)-挂载(渲染模板)-更新(修改数据,更新视图)-销毁(销毁实例) eg: 案例——记事本! 1.成果展示 2.需求:商品的添加与删除;价格超过500标红;统计计算总消费;消费账单使用饼图展示

    2024年01月19日
    浏览(60)
  • Vue2技能树(3)-声明式渲染、指令大全、生命周期函数

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! Vue2技能树(1)-介绍、导入使用、响应式数据绑定、组件化开发 vue2技能树(2)-模板语法、vue的工具链、渐进式框架 Vue2技能树(3)-声明式渲染、指令大全、生命周

    2024年02月07日
    浏览(51)
  • 【React】: React的生命周期

    生命周期的每个阶段总是伴随着一些方法的调用,这些方法就是生命周期的钩子函数 钩子函数的作用:为开发人员在不同操作阶段提供了十几 只有 类组件 才有生命周期   生命周期的图片:  同时有:  编写以下代码,从而验证constructor,render,componentDidMount的顺序: 在开发者

    2024年02月08日
    浏览(43)
  • Vue.js 生命周期详解

    Vue.js 是一款流行的 JavaScript 框架,它采用了组件化的开发方式,使得前端开发更加简单和高效。在 Vue.js 的开发过程中,了解和理解 Vue 的生命周期非常重要。本文将详细介绍 Vue 生命周期的四个阶段:创建、挂载、更新和销毁。 在创建阶段,Vue 实例被创建并初始化。这个阶

    2024年02月13日
    浏览(41)
  • 【React学习】React组件生命周期

    在 React 中,组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法,在不同的生命周期方法中,开发人员可以执行不同的操作,例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期大致可以分为三个阶段,即组件挂载时,更

    2024年02月12日
    浏览(41)
  • 【react】react生命周期钩子函数:

    一、生命周期概念: 生命周期:简单来说就是一个事物从出生到消亡的过程就是生命周期,在React中的生命周期,就是组件从创建、挂载到页面再到卸载组件的过程。 意义:生命周期有助于理解组件运行方式、完成复杂组件功能、分析组件中间问题产生的原因等。 生命周期钩子函数

    2024年02月14日
    浏览(46)
  • Vue.js生命周期及其应用示例

    Vue.js是一种流行的前端JavaScript框架,可以让开发人员轻松构建动态用户界面。Vue.js的一个关键特性是其生命周期系统,它允许开发人员在组件的不同阶段执行代码。在本文中,我们将探讨Vue.js生命周期的不同阶段以及如何在这些阶段执行代码,并举例说明。 Vue.js生命周期分

    2024年02月08日
    浏览(42)
  • 面试题-React(六):React组件和生命周期

    一、React组件 React组件简介: React组件是构建用户界面的基本单元。它们将界面拆分成独立、可重用的部分,使得代码更加模块化、可维护性更高。React组件可以是函数组件或类组件,它们接收输入的数据(称为props)并返回表示用户界面的React元素。 创建React组件: 在React中

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包