React面试经验2

1.执行顺序题

复制代码
onClick = () => {
    //a
    this.setState({
      num: this.state.num + 1,
    })
    console.log('1:',this.state.num);
    //b
    this.setState({
      num: this.state.num + 1,
    })
    console.log('2:',this.state.num);
    setTimeout(() => {
      //c
      this.setState({
        num: this.state.num + 1,
      });
      console.log('3:',this.state.num);
    }, 0);
    //d
    this.setState(preState => ({
      num: preState.num + 1,
    }),() => {
      console.log('4:',this.state.num);
    })
    //e
    this.setState(preState => ({
      num: preState.num + 1,
    }))
    console.log('5:',this.state.num);
}

此处注意点:1.同步与异步更新

2.setState传递参数为函数时不会被合并

1.console.执行顺序

1,2,5,4,3

(4,3是什么原因)

值的更新

a,b合并,并且都是异步,所以打印更新前的值

de不合并,都能获取到

题2

复制代码
async function async1(){
  console.log('async1 start');
  let res = await async2();
  console.log(res);
  console.log('async1 end');
}

async function async2(){
  console.log('async2 start');
  return 'async2 end'
}

console.log('script start');
setTimeout(() => {
  console.log('setTimeout');
}, 0);
async1();
new Promise((resolve,reject) => {
  console.log('Promise start');
  resolve();
}).then(() => {
  console.log('Promise end');
})
console.log('script end');

注意,async函数的return内容会被Promise.resolve包装

diff算法的区别

区别:

策略不同: React 使用双端比较策略,而 Vue 使用双指针或同层比较策略。

节点复用: Vue 更注重节点的复用,尽可能地复用相同类型的节点,而 React 则更倾向于替换整个节点。

性能差异: 由于实现策略不同,React 和 Vue 的 diff 算法在性能上可能会有所不同,但具体的性能差异会受到多种因素的影响,如虚拟 DOM 树的大小、节点的层级结构等。

总的来说,React 和 Vue 的 diff 算法都是为了实现高效的页面更新,它们在实现上有一些差异,但都能够很好地满足前端开发的需求

相比于 class 类组件,hooks 到底解决了什么问题?

1.较好地解决了class组件中逻辑复用的问题

2.实现生命周期管理

3.useMemo和useCallback等提供了性能优化

useState 的原理是什么,背后怎么执行的,它怎么保证一个组件中写多个 useState 不会串

useState 是 React 用于在函数组件中添加状态的 Hook。在 React 16.8 版本中首次引入 Hooks 后,useState 成为了在函数组件中管理局部状态的首选方法。下面我们来详细了解 useState 的原理和执行机制:

原理

  1. 声明式编程:React Hooks 允许你在函数组件中以声明的方式使用状态和其他 React 特性,而不是通过类组件和生命周期方法。

  2. 状态存储 :当你在一个函数组件中调用 useState,React 会为这个组件创建一个状态变量。这个状态变量被存储在组件的内部状态环境中。

  3. 状态更新useState 返回一个数组,包含当前的状态值和一个更新该状态的函数。当你调用这个函数并传递一个新的状态值时,React 会计划一个状态更新,并在下一个渲染周期重新渲染组件。

执行机制

  1. 首次渲染 :在函数组件的首次渲染中,useState 被调用,React 创建对应的状态变量,并将其初始化为传递给 useState 的参数值。

  2. 后续渲染 :在后续的渲染中,当组件需要重新渲染时(可能是因为状态更新、条件变化、props 更改等),useState 返回的状态变量和更新函数会保持不变。

  3. 状态更新:当更新函数被调用时,React 会将新的更新加入一个队列。在当前渲染周期结束后,React 会处理这个队列中的所有更新,并决定哪些组件需要重新渲染。

多个 useState 的管理

  1. 独立状态 :在同一个组件中使用多个 useState 调用,每个调用都会创建一个独立的、完全分离的状态变量。这些状态变量互不影响。

  2. 状态标识 :React 通过内部机制为每个 useState 调用生成一个唯一的标识,即使它们在同一个组件中,也能确保不会混淆。

  3. 渲染顺序 :React 保证了组件内部 useState 调用的顺序与它们在代码中的声明顺序相匹配。这意味着,即使有多个状态变量,它们也会按照你在代码中声明的顺序被初始化和更新。

sessionStorage 不能在多个窗口或标签页之间共享数据,但是当通过 window.open 或链接打开新页面时(不能是新窗口),新页面会复制前一页的 sessionStorage。

fiber

React 和 Vue 是两个流行的前端 JavaScript 库,它们都用于构建用户界面,并且都采用了虚拟 DOM(Virtual DOM)的概念来提高性能。不过,React 16 引入了 Fiber 架构,这是一种重新实现的虚拟 DOM 算法,它为 React 带来了一些显著的改进。以下是 React 的 Fiber 与 Vue 的虚拟 DOM 之间的一些关键区别:

异步更新(Async Updates)

React Fiber:

  • React 的 Fiber 架构允许组件更新变得可中断和可恢复。这意味着 React 可以将更新过程分成小块,允许浏览器在每个小段之间进行渲染,从而提高性能并避免长时间的阻塞。
  • 这种异步更新机制使得 React 能够实现时间切片(time slicing),从而更好地控制更新的执行时机,提供更平滑的用户体验。

Vue Virtual DOM:

  • Vue 的虚拟 DOM 更新通常是同步的。当数据变化时,Vue 会立即触发相应的视图更新。
  • 虽然 Vue 2.0 引入了异步批处理来提高性能,但它并不像 React Fiber 那样在算法层面支持更新的中断和恢复。

性能优化

React Fiber:

  • Fiber 架构的主要目标是提高大型应用的性能,尤其是在处理大量组件和复杂更新时。
  • React 的时间切片功能允许应用在高负载时仍能保持响应,例如在滚动或动画过程中。

Vue Virtual DOM:

  • Vue 的虚拟 DOM 优化主要侧重于减少不必要的 DOM 操作,通过高效的差异比较算法来更新实际的 DOM。
  • Vue 也提供了一些性能优化手段,如 key 的使用、计算属性、懒加载等,但它们与 React Fiber 的异步更新机制不同。

组件生命周期

React Fiber:

  • React 的 Fiber 架构引入了新的生命周期方法,如 getSnapshotBeforeUpdategetDerivedStateFromError,以及对现有生命周期方法的一些更改。
  • 由于更新的异步性,React 的生命周期方法的行为可能与之前的版本有所不同。

Vue Virtual DOM:

  • Vue 提供了明确定义的组件生命周期钩子,如 createdmountedupdateddestroyed
  • Vue 的生命周期钩子通常在虚拟 DOM 的更新过程中的不同阶段被调用,且这些钩子的执行是同步的。

源码实现

React Fiber:

  • Fiber 的实现相对复杂,它使用了一个循环的数据结构来表示组件的更新过程,这使得 React 能够更精细地控制组件的渲染和副作用处理。

Vue Virtual DOM:

  • Vue 的虚拟 DOM 实现较为简洁,它使用了一个递归的树状结构来表示组件和元素。

总结

React 的 Fiber 架构和 Vue 的虚拟 DOM 都是为提高性能而设计的,但它们在实现细节和提供的优化机制上存在一些差异。React Fiber 通过异步更新和时间切片来优化大型应用的性能,而 Vue 则侧重于减少不必要的 DOM 操作和提供一系列生命周期钩子来进行性能优化。开发者可以根据项目需求和个人偏好选择合适的库。

在react15及之前是没有fiber的,react执行一次更新操作都是同步的,他是通过递归去进行更新,一旦开始就不会中断直到结束。这也就造成了页面性能的低下,体验非常差。

而fiber的出现,他将更新渲染耗时长的大任务变成很多小切片,小切片执行完后就去执行高优先级的任务,比如:用户点击输入等等,将不可中断的渲染变成可中断的渲染,提高了页面的流畅度和性能。

有了fiber,React 渲染的过程可以被中断,可以将控制权交回浏览器,让位给高优先级的任务,浏览器空闲后再恢复渲染。它采用的是一种主动让出机制。(可以由游览器给我们分配执行时间片,通过requestIdleCallback实现

相关推荐
码事漫谈6 分钟前
解决 Anki 启动器下载错误的完整指南
前端
im_AMBER26 分钟前
Web 开发 27
前端·javascript·笔记·后端·学习·web
聪明的笨猪猪1 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
蓝胖子的多啦A梦1 小时前
低版本Chrome导致弹框无法滚动的解决方案
前端·css·html·chrome浏览器·版本不同造成问题·弹框页面无法滚动
玩代码1 小时前
vue项目安装chromedriver超时解决办法
前端·javascript·vue.js
訾博ZiBo1 小时前
React 状态管理中的循环更新陷阱与解决方案
前端
StarPrayers.1 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
聪明的笨猪猪2 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
一壶浊酒..2 小时前
ajax局部更新
前端·ajax·okhttp
苏打水com2 小时前
JavaScript 面试题标准答案模板(对应前文核心考点)
javascript·面试