当前位置: 首页 > 面试题库 >

React Hooks:在监听器中获取useState的状态

况谦
2023-03-14
问题内容

我的组件内部有这个:

const [ pendingMessages, setPendingMessages ] = React.useState([]);

React.useEffect(function() {
    ref.current.addEventListener('send-message', onSendMessage);
    return function() {
      ref.current.removeEventListener('send-message', onSendMessage);
    };
  }, []);

function onSendMessage(event) {
  const newMessage = event.message;
  console.log('Here not up to date :(', pendingMessages);
  setPendingMessages([ ...pendingMessages, newMessage ]);
}

问题在于pendingMessages监听器内部不是最新的,因为它不在渲染器内部。它已经连接了。有什么想法我该如何解决?

谢谢!


问题答案:

问题是由于运行效果时形成的闭合。由于您将设置useEffect为仅在初始安装时运行,因此它pendingMessages从声明时形成的闭包中获取值,因此即使pendingMessages更新,pendingMessages内部onSendMessage也将引用最初存在的相同值。

由于您不想访问其中的值,onSendMessage而只是根据先前的值更新状态,因此您可以简单地使用setter的回调模式

const [ pendingMessages, setPendingMessages ] = React.useState([]);

React.useEffect(function() {
    ref.current.addEventListener('send-message', onSendMessage);
    return function() {
      ref.current.removeEventListener('send-message', onSendMessage);
    };
  }, []);

function onSendMessage(event) {
  const newMessage = event.message;
  setPendingMessages(prevState =>([ ...prevState, newMessage ]));
}


 类似资料:
  • 主要内容:监听器的分类,监听对象创建和销毁的监听器,监听属性变更的监听器,监听 Session 中对象状态改变的监听器,注册监听器监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java 对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即自动执行。 监听器的相关概念: 事件:方法调用、属性改变、状态改变等。 事件源:被监听的对象( 例如:request、session、servletContext)。 监听器:用于监听事件源对象

  • 性能测试就是以各种形式分析服务器响应,然后将其呈现给客户端。 当JMeter的采样器组件被执行时,监听器提供JMeter收集的关于那些测试用例的数据的图形表示。它便于用户在某些日志文件中以表格,图形,树或简单文本的形式查看采样器结果。 监听器可以在测试的任何地方进行调整,直接包括在测试计划下。JMeter提供了大约15个监听器,但主要使用的是表,树和图形。 以下是JMeter中所有监听器的列表:

  • { "name": "...", "address": "...", "filters": [], "ssl_context": "{...}", "bind_to_port": "...", "use_proxy_proto": "...", "use_original_dst": "...", "per_connection_buffer_lim

  • Envoy配置顶层包含一个监听器列表。每个单独的监听器配置具有以下格式: v1 API参考 v2 API参考 统计 监听器 每个监听器都有一个以 listener.<address> 为根的统计树。统计如下: 名称 类型 描述 downstream_cx_total Counter 连接总数 downstream_cx_destroy Counter 销毁的连接总数 downstream_cx_a

  • Envoy配置支持单个进程中的任意数量的监听器。通常我们建议每台机器运行一个Envoy,而不关心监听器数量。这样可以使操作更简单,统计也更简单。目前Envoy只支持监听TCP。 每个监听器都独立配置一定数量的(L3 / L4)网络过滤器。当监听器接收到新连接时,实例化相应过滤器,并开始处理后续事务。通用监听器用于执行不同代理任务(例如,速率限制,TLS客户机认证,HTTP连接管理,MongoDB嗅

  • 五种类型 EventListenerTouch - 响应触摸事件 EventListenerKeyboard - 响应键盘事件 EventListenerAcceleration - 响应加速度事件 EventListenMouse - 响应鼠标事件 EventListenerCustom - 响应自定义事件 事件的吞没 当你有一个监听器,已经接收到了期望的事件,这时事件应该被吞没。事件被吞没,意