React原理

本文探讨了React中的setState异步性及其推荐语法,解释了如何利用回调函数确保状态更新的顺序。此外,还介绍了JSX的本质以及组件性能优化方法,包括减轻state负担、避免不必要的重新渲染和使用纯组件。最后,阐述了虚拟DOM和Diff算法在实现部分更新中的关键作用。
摘要由CSDN通过智能技术生成

一、setState 

(一)异步性

setState是异步更新数据的:

以下代码执行结构中log打印出来的数据是1,表示setState是在log后被执行的,是一个异步操作

state = {
    number: 1
  }
  add = () => {
    this.setState({
      number: this.state.number+1
    })
    console.log(this.state.number)  // 1
  }

这种异步性会导致如果一个方法中存在两个setState,后面的setState无法基于前面setState设置好的结果来进行相关操作,因此引出了推荐语法来解决这一问题:

(二)推荐语法

参数:

state:表示最新的state

props:表示最新的props

state = {
    number: 1
  }
  add = () => {
    this.setState((state, props) => {
      return {
        number: state.number+1
      }
    })
    this.setState((state, props) => {
      return {
        number: state.number+1
      }
    })
    console.log(this.state.number)  // 1
  }

1、log结果仍为1表示该方法也是异步的

2、使用这种方法执行过两次setState时,后面的setState通过回调函数中的参数state可以获取到最新的值,因此执行完毕number的值为3,也就是两次setState均有效。

(三)setState的回调函数

当需要在setState执行结束后进行一些操作时,可以调用setState方法提供的回调函数(参数形式):

state = {
    number: 1
  }
  add = () => {
    this.setState(
       // 参数1:state
      (state, props) => {
        return {
          number: state.number+1
        }
      },
      // 参数2:callback
      // 状态更新并重新渲染后立即执行
      () => {
        console.log('callback:', this.state.number) // 2
      })
    console.log(this.state.number)  // 1
  }

二、JSX

  • JSX仅仅是createElement()方法的语法糖(简化语法)
  • JSX语法被@babel/preset-react插件编译为createElement()方法
  • React元素:是一个对象,用来描述你希望在屏幕上看到的内容

三、 组件性能优化

(一)减轻state

只存储跟组件渲染相关的数据,不用做渲染的数据不要放在state中,比如定时器id等,对于这种需要在多个方法中用到的数据,应该放在this中

(二)避免不必要的重新渲染

  • 组件更新机制:父组件更新会引起子组件也被更新,但子组件没有任何变化时也会重新渲染,这就产生了不必要的渲染
  • 解决方式:使用钩子函数shouldComponentUpadte(nextProps, nextState)
  • 作用:通过返回值决定该组件是否重新渲染,返回true/false
  • 触发时机:更新阶段的钩子函数,组件重新渲染前执行(shouldComponentUpadte→render)
// 钩子函数
  shouldComponentUpdate(nextProps, nextState, nextContext) {
    // 返回false,阻止组件重新渲染
    // return false
    
    // 最新的状态:
    console.log('最新的state:', nextState)
    // 更新前的状态:
    console.log('this.state:', this.state)
    
    return true
  }

(三)纯组件

  • 说明:纯组件内部的对比是shallow compare(浅层对比)
  • 对于值类型来说:比较两个值是否相同(直接赋值即可,没有坑)
  • 对于引用类型来说:只比较对象的引用(地址)是否相同

            state或props中属性值为引用类型时,应该创建新数据,不要直接修改原数据

四、虚拟DOM和Diff算法

作用:实现部分更新(组件中如果只有一个DOM元素需要更新,不需要把整个组件内容重新进行渲染,因此需要使用该方法来实现部分元素的更新)

虚拟DOM:本质就是一个JS对象,用来描述我们希望在屏幕上看到的内容(UI)

执行过程

  1. 初次渲染时,React会根据初始state(Model),创建一个虚拟DOM对象(树)
  2. 根据虚拟DOM生成真正的DOM,渲染到页面中
  3. 当数据变化后(setState),重新根据新的数据,创建新的虚拟DOM对象(树)
  4. 与上一次得到的虚拟DOM对象,使用Diff算法对比(找不同),得到需要更新的内容
  5. 最终,React只将变化的内容更新(patch)到DOM中,重新渲染到页面

React路由

Vue-React组件库的实现原理主要是通过将Vue组件转化为React组件,或将React组件转化为Vue组件,从而实现在Vue和React项目中同时使用的目的。 具体来说,Vue-React组件库的实现原理有以下几种方式: 1. 使用Vue-React转换器:Vue-React转换器是一个将Vue组件转换为React组件的工具,可以实现在React项目中使用Vue组件。转换器的实现原理是将Vue组件的模板转换为React组件的JSX语法,再在React项目中引入转换后的React组件。这种方式需要注意Vue组件的语法和React组件的语法差异,以及转换器的兼容性和性能问题。 2. 使用Vue-React组件库:Vue-React组件库是一个同时支持Vue和React的UI组件库,可以直接在Vue和React项目中使用。组件库的实现原理是针对Vue和React两种框架分别提供了组件的实现,通过封装和兼容处理,实现在两种框架中的使用。这种方式需要注意组件的兼容性和性能问题,以及组件库的选择和使用方法。 3. 使用Web Components:Web Components是一种通用的组件规范,可以在各种前端框架中使用。Vue和React都支持Web Components规范,因此可以使用Web Components实现在两种框架中共享组件。这种方式需要注意组件的规范和兼容性问题,以及Web Components的使用方法和浏览器支持情况。 需要注意的是,使用Vue-React组件库的方式相对简单,而且在实现原理上比较清晰,因此在实际开发中比较常用。但是,不同的Vue-React组件库实现方式略有不同,需要根据具体组件库的文档进行使用和配置。同时,也需要注意不同框架之间的差异和兼容性问题,避免出现不可预期的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值