React面试(二)

文章目录

一、类组件和函数组建的异同

类组件:

类组件中必须有render()方法,用于返回react元素

state和prop需要通过this访问

类组件具有react的生命周期(比如componentDidmount 、componentDidUpdate)

函数组件

函数组件中没有state

函数组件通过JS函数或者箭头函数声明

直接返回react元素

引入hooks之后具有和类组件的状态和生命周期等

二、refs

refs通过i工了一种方式,允许我们直接操作DOM

用途:

获取鼠标焦点:比如在提交的时候,对组件格式进行校验,如果有不对的地方,鼠标自动获取到该组件上

触发动画:在需要通过直接操作DOM元素去触发动画时,可以使用ref这季节修改元素的样式

继承第三方库:比如需要直接对DOM元素操作第三方库,比如需要通过D3.js生成图表,ref可以提供直接的DOM访问能力

声明:在类组件中通常使用React.createRef创建ref,并赋值给相应的变量,在函数组件中通常使用useSate()进行声明。

访问:在类组件中使用this.myRef.current来访问指向的节点

在函数组件中通过使用myRef.current来访问ref

三、react事件和普通的html事件有什么不同

react事件和普通的html事件有以下区别

react为了确保跨浏览器的一致性,使用了合成事件,而在html原生事件中,事件处理器直接接触到浏览器的原生事件对象

react中事件命名使用驼峰命名发,后跟事件函数,而html原生事件命名全部小写,后跟JS代码

react使用事件委托机制,有助于减少内存提高浏览器性能,而在html原生事件中,需要手动实现事件委托。

以上区别使得react的事件处理更加一致,易于管理,同时也提高了跨浏览器的一致性

四、React 组件中怎么做事件代理?它的原理是什么?

事件代理是一种优化事件处理 的技术,react本身已经在底层使用了事件代理,但也可以手动实现事件代理来进一步优化性能。

原理:事件代理的核心思想是将事件绑定到一个共有的父元素上,而不是直接绑定到每个子元素上。当事件触发时,事件会冒泡到父元素,父元素通过e.target属性来判断事件的触发者,并执行相应的逻辑。

优点:

减少内存占用:不需要为每个子元素绑定事件

动态元素支持:当动态的添加或者删除子元素的时候,也不需要重新绑定或解绑事件

性能优化:减少了事件绑定的数量,提高了性能。

五、React组件的构造函数有什么作用?它是必须的吗?

构造函数在类组件中主要初始化局部状态和绑定事件处理器,但是他不是必须的,随着类属性和箭头函数的使用,以及函数组件和hooks的运用,构造函数的使用频率大大降低。

六、在React中如何避免不必要的render

使用React.memo包裹函数组件

React.memo是一个高阶组件,它仅对其包裹的组件在props发生变化时才重新渲染。这对于优化性能非常有用,尤其是当你知道一个组件在特定props没有变化时不需要更新时。

css 复制代码
const MyComponent = React.memo(function MyComponent(props) {
  /* render using props */
});

使用shouldComponentUpdate生命周期方法

对于类组件,你可以使用shouldComponentUpdate生命周期方法来阻止组件的不必要更新。这个方法允许你通过比较当前和下一个state或props来决定组件是否需要更新

css 复制代码
class MyComponent extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    // 返回true或false来控制组件是否应该更新
  }
}

使用PureComponent

React.PureComponent与React.Component相似,但PureComponent通过对props和state进行浅比较来减少不必要的渲染。

css 复制代码
class MyComponent extends React.PureComponent {
  // Your component logic
}

使用useMemo和useCallback钩子

对于函数组件,useMemo和useCallback可以帮助你避免不必要的渲染。useMemo可以用来缓存计算结果,只有在其依赖项变化时才重新计算。useCallback则用于缓存函数,确保函数身份在依赖项不变的情况下保持不变。这些都有助于避免因为不必要的更新导致的渲染。

css 复制代码
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => {
  doSomething(a, b);
}, [a, b]);
相关推荐
Dream-Y.ocean24 分钟前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Highcharts.js1 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
JavaPub-rodert4 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
kyriewen4 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
工控丫丫5 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
IT规划师6 小时前
编程术语中的同步与异步:从"等不等"到工程取舍
后端·面试
Dream-Y.ocean8 小时前
鸿蒙PC平台星图遥感适配实战:基于 Electron 壳方案的纯 JavaScript 遥感图像处理引擎开发
javascript·electron·harmonyos
螺丝钉tina8 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
Highcharts.js11 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
Java后端的Ai之路11 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli