React面试宝典

woaidaqipaiqiu1122 · · 261 次点击 · · 开始浏览    
React面试宝典 React 是靠数据驱动视图改变的一种框架,它的核心驱动方法就是用其提供的 setState 方法设置 state 中的数据从而驱动存放在内存中的虚拟 DOM 树的更新。 更新方法就是通过 React 的 Diff 算法比较旧虚拟 DOM 树和新虚拟 DOM 树之间的 Change ,然后批处理这些改变。 React 性能优化的手段 React 中进行性能优化的手段可以从多个维度进行分类,以下是一些关键类别及其对应的优化策略: 1. 组件优化 使用PureComponent或React.memo:对于仅根据props和state改变才重新渲染的组件,使用React.PureComponent或者对其包装一层React.memo,它们都能通过浅比较props来避免不必要的重新渲染。 shouldComponentUpdate/React Hooks中的useMemo/useCallback:在类组件中实现shouldComponentUpdate生命周期方法来手动控制是否更新组件。在函数组件中,使用useMemo缓存计算结果,useCallback缓存回调函数,防止因依赖项不变而引起的无效渲染。 2. 状态管理与变更 减少不必要的setState调用:合并多次对同一状态的修改,例如使用useState hook时,可以利用函数式的setState来一次性更新多个状态值。 选择性地更新state:只在props或state真正发生变化时才进行更新,避免频繁或大面积的state变更引发大量子组件重新渲染。 3. Virtual DOM与Diff算法优化 合理构建组件层级:保持组件树扁平化,减少不必要的嵌套层次,使React的diff算法更高效。 利用key属性:为列表元素提供稳定的唯一key,帮助React识别并最小化DOM变动。 少用 dom 层级 多使用箭头标签替代 4. 事件处理优化 使用合成事件:React的合成事件系统可以减少全局事件监听器的数量,提高事件处理效率。 避免内联函数绑定:在事件处理函数中,避免每次渲染时创建新的函数引用,而是使用箭头函数或者useCallback来缓存函数引用。 5. 懒加载与代码分割 动态导入:使用React.lazy和Suspense来按需加载组件,减轻初始加载负担,提高首屏加载速度。 使用优先级加载CSS、JavaScript和图片资源。 6. 优化渲染过程 使用ReactDOM.createPortal:将某些组件渲染到根DOM之外,比如渲染到document.body,可以避免不必要的re-render。 CSS动画与交互优化:配合requestAnimationFrame等API来处理复杂的动画,减少不必要的布局重排和重绘。 7、工具辅助 Profiler工具:利用React DevTools的Profiler面板分析组件渲染性能瓶颈。 性能监控与警告:设置性能指标监控点,及时发现和修复潜在性能问题。 8、前端通用优化 静态资源压缩与HTTP缓存:优化CSS、JavaScript文件大小,合理设置HTTP缓存策略。 服务端渲染(SSR):针对SEO友好和首屏加载速度,结合Next.js等框架进行服务器端渲染。 Fiber架构出现之前 react 存在的问题 主线程阻塞:在React 15及更早版本中,当组件树发生更新时,React会通过递归算法一次性完成整个组件树的渲染过程,这个过程如果涉及大量组件,会导致主线程长时间阻塞,无法处理其他的UI交互,从而造成卡顿和延迟,降低用户体验。 无法中断与恢复渲染:原有的渲染过程不具备中断和恢复的能力,一旦开始渲染,就必须等到整个过程结束,即使在中间有更高优先级的任务也需要等待。 无法实现增量渲染:以往的React无法有效区分渲染任务的重要性和紧急程度,所有更新任务都被视为同等重要的,无法做到逐步、增量地渲染UI。 资源优化不足:旧版React无法根据应用的具体需求动态分配资源,无法高效利用有限的CPU周期来优化渲染性能。 1、说说React的事件机制? 在React中,基于浏览器事件有一套自身的事件机制,包括:事件注册、事件合成、事件派发等,这些事件被称为合成事件。它的所有事件都是挂载在Document对象上,当真实DOM触发时,会冒泡到document上后,再处理react事件,所以会先执行原生事件,再处理react事件,最后再真正执行document上挂载事件。 2、说说React中引入css的方式有哪几种?区别? 常见的引入方式: 在组件内直接使用 组件中引入.css文件 组件中引入.modules.css文件 CSS in JS 3、React中组件之间是如何通信的? react中通信方式有以下几种: 父向子:父组件在调用子组件的时候,只需要在子组件标签内传递参数,子组件通过props属性就能接收父组件传递过来的参数。 子向父:子组件向父组件通信的基本思路是,父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值。 兄弟间:父组件作为中间层来实现数据的互通,通过使用父组件传递。 父向后代:使用 context 提供了组件之间通讯的一种方式,可以共享数据,其他数据都能读取对应的数据。 非关系:使用redux,创建全局资源数据管理,共用实现通信。 4、Redux工作原理 Redux 是 React 的第三方状态管理库,创建于上下文API存在之前。它基于一个称为存储的状态容器的概念,组件可以从该容器中作为 props 接收数据。更新存储区的唯一方法是向存储区发送一个操作,该操作被传递到一个reducer中。reducer接收操作和当前状态,并返回一个新状态,触发订阅的组件重新渲染。 ![QQ截图20241024103109.png](http://static.itsharecircle.com/241024/2c9ce96c3bc81183eaee52a6028edae5.png)
261 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传