栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

错误的React将事件监听器的行为挂钩

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

错误的React将事件监听器的行为挂钩

对于使用

useState
钩子的功能组件,这是常见的问题。相同的考虑适用于
useState
使用状态的任何回调函数,例如
setTimeout
setInterval
定时器函数。

事件处理程序在

CardsProvider
Card
组件中被区别对待。

handleCardClick
并且
handleButtonClick
CardsProvider
功能组件中使用的组件在其范围内定义。每次运行时都有新功能,它们引用
cards
在定义它们时获得的状态。每次
CardsProvider
呈现组件时都会重新注册事件处理程序。

handleCardClick
用于
Card
功能组件的组件会作为道具接收并在组件支架上一次注册
useEffect
。它在整个组件寿命期间都具有相同的功能,并且是指在首次
handleCardClick
定义功能时新鲜的陈旧状态。
handleButtonClick
作为道具接收并在每个
Card
渲染器上重新注册,每次都是新功能,并引用新鲜状态。

可变状态

解决此问题的常用方法是使用

useRef
而不是
useState
。引用基本上是一种配方,提供了一个可变对象,可以通过引用传递该对象:

const ref = useRef(0);function eventListener() {  ref.current++;}

万一组件应该在状态更新时重新渲染,如预期的那样

useState
,则refs不适用。

可以分别保持状态更新和可变状态,但是

forceUpdate
在类和函数组件中都被视为反模式(列出仅供参考):

const useForceUpdate = () => {  const [, setState] = useState();  return () => setState({});}const ref = useRef(0);const forceUpdate = useForceUpdate();function eventListener() {  ref.current++;  forceUpdate();}

状态更新器功能

一种解决方案是使用状态更新程序功能,该功能从封闭的范围接收新鲜状态而不是陈旧状态:

function eventListener() {  // doesn't matter how often the listener is registered  setState(freshState => freshState + 1);}

如果需要一个状态来实现同步副作用,例如

console.log
,一种解决方法是返回相同状态以防止更新。

function eventListener() {  setState(freshState => {    console.log(freshState);    return freshState;  });}useEffect(() => {  // register eventListener once}, []);

这不适用于异步副作用,尤其是

async
函数。

手动事件侦听器重新注册

另一种解决方案是每次都重新注册事件侦听器,因此回调总是从封闭范围获得新状态:

function eventListener() {  console.log(state);}useEffect(() => {  // register eventListener on each state update}, [state]);

内置事件处理

除非在上注册了事件侦听器

document
window
或者其他事件目标不在当前组件的范围之内,否则在可能的情况下必须使用React自己的DOM事件处理,这样就不需要
useEffect

<button onClick={eventListener} />

在最后一种情况下,事件侦听器可以作为道具传递时,还可以通过

useMemo
useCallback
来记住,以防止不必要的重新渲染:

const eventListener = useCallback(() => {  console.log(state);}, [state]);

答案的先前版本建议使用可变状态,该可变状态适用

useState
于React16.7.0-alpha版本中的初始钩子实现,但不适用于最终的React16.8实现。
useState
当前仅支持不可变状态。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号