巽风科技
一面-视频面试
- 怎么设计类型检查函数,包括签名
- tailwind和cssinjs的区别
- 类型系统对业务开发来说的好处
- 算法题目: 树的有效长度路径
React 中 useEffect 回调函数的返回值, 会随着useEffect的依赖项变化而变化吗?
React 中 useEffect 回调函数中, 使用setState() 1次或多次会发生什么? 如果将这1次或者多次setState() 放在setTimeout中会发生什么?
参考答案
在 React 中,
useEffect回调函数中使用setState会触发重新渲染。具体的行为取决于setState调用的次数以及是否使用了setTimeout。以下是详细的解释:- 在
useEffect中直接调用setState一次
当
useEffect中的setState被调用一次时,会触发组件重新渲染。重新渲染时,React 会执行组件函数,并重新计算组件的状态和虚拟 DOM。jsimport React, { useState, useEffect } from 'react'; function MyComponent() { const [count, setCount] = useState(0); useEffect(() => { setCount(1); }, []); return <div>{count}</div>; }在这个例子中,
setCount(1)会触发组件重新渲染,count的值会更新为1并显示在页面上。- 在
useEffect中调用setState多次
当
useEffect中调用setState多次时,React 会批量处理这些状态更新,并且在同一事件循环中只会触发一次重新渲染。jsimport React, { useState, useEffect } from 'react'; function MyComponent() { const [count, setCount] = useState(0); const [value, setValue] = useState(0); useEffect(() => { setCount(1); setValue(1); }, []); return ( <div> <div>Count: {count}</div> <div>Value: {value}</div> </div> ); }在这个例子中,尽管
setCount(1)和setValue(1)被调用了两次,但 React 会批量处理这两个状态更新,并在同一事件循环中只重新渲染一次组件。- 在
setTimeout中调用setState一次或多次
如果将
setState调用放在setTimeout中,这些状态更新会在定时器到期时执行,并且每次状态更新都会触发一次重新渲染。- 调用一次
setState:
jsimport React, { useState, useEffect } from 'react'; function MyComponent() { const [count, setCount] = useState(0); useEffect(() => { setTimeout(() => { setCount(1); }, 1000); }, []); return <div>{count}</div>; }在这个例子中,
setCount(1)会在 1 秒后执行,并触发组件重新渲染,count的值会更新为1并显示在页面上。- 调用多次
setState:
jsimport React, { useState, useEffect } from 'react'; function MyComponent() { const [count, setCount] = useState(0); const [value, setValue] = useState(0); useEffect(() => { setTimeout(() => { setCount(1); setValue(1); }, 1000); }, []); return ( <div> <div>Count: {count}</div> <div>Value: {value}</div> </div> ); }在这个例子中,
setCount(1)和setValue(1)会在 1 秒后执行,React 会批量处理这两个状态更新,并在同一事件循环中只重新渲染一次组件。总结
- 直接在
useEffect中调用setState(一次或多次)会触发一次重新渲染,React 会批量处理多次状态更新。 - 在
setTimeout中调用setState会在定时器到期时执行状态更新,并触发重新渲染。即使在setTimeout中多次调用setState,React 也会批量处理这些状态更新并触发一次重新渲染。
React 的批处理机制使得多次状态更新在同一个事件循环中只会触发一次重新渲染,优化了性能。
- 在
React 18 的并发模式怎么开启?
代码设计题:
设计并实现一个命令链式调用器,该调用器只有在执行 execute() 方法时才会依次执行一系列命令,其他方法均不执行。
要求: 实现一个 Command 类,具有以下功能: 实现 say(message) 方法,输出目标对象的消息。 实现 delay(seconds) 方法,延迟指定秒数后执行上一个命令。 实现 execute() 方法,依次执行添加的命令
示例:
js// say delay 可以任意组合并链式下去 const cmd = new Command("Jax"); cmd.say("hi").say("Julie").delay(5).say("let go").execute(); // Jax hi 延迟5秒 Julie let go cmd.say("hi").delay(5).say("let go") // 没有任何输出信息参考答案
个人文章:实现链式调用和延迟执行
二面-视频面试
- React Fiber 架构
- websocket 怎么断线重连?
- webpack loader和plugin的区别? style-loader 的用处?
- 沙箱的实现?
- 小程序怎么避免体积过大?
- 移动端 0.5px 的实现?
