我使用此代码,
参考:https://blog.csdn.net/lucky_ly/article/details/138096824
接收到发送过来的数据,为何会打印两次呢?
emitter目录:
emitter/index.ts
import type { Emitter } from 'mitt'
import mitt from 'mitt'
export default mitt() as Emitter<any>
组件A:
import { useEffect } from 'react'
import Emitter from '../../emitter'
function Index() {
useEffect(() => {
console.log('mounted') // 挂载后
}, [])
return <>
AAA
<button onClick={() => {
console.log('按钮被点击')
Emitter.emit('e1',{"name":"zhangsah=n"})
}
}>A发送信息到B</button>
</>
}
export default Index
组件B:
import { useEffect } from 'react'
import Emitter from '../../emitter'
function Index() {
useEffect(() => {
console.log('mounted') // 挂载后
Emitter.on('e1',(e)=>{
console.log('mitt test',e)
})
}, [])
return <>
BBB
</>
}
export default Index
点击A组件按钮的时候,B组件内打印了两次:
从您提供的代码和描述来看,B组件中打印了两次mitt test
消息的原因通常不是由于Emitter.emit('e1', ...)
被调用了两次,而是因为Emitter.on('e1', ...)
事件监听器被注册了两次。这通常发生在React组件的重新渲染或重新挂载时。
在React中,useEffect
的依赖项数组(在您的情况下是[]
)决定了这个effect何时运行。当依赖项数组为空时,effect会在组件挂载后运行,并在每次更新后重新运行(包括父组件的更新)。由于您的effect没有依赖任何props或state,因此每次组件重新渲染时,它都会重新运行,包括重新注册事件监听器。
为了解决这个问题,您需要在组件卸载时取消事件监听器的注册。您可以通过返回一个清除函数(cleanup function)来做到这一点,该清除函数在组件卸载前或effect的重新运行前被调用。
修改后的组件B代码如下:
import { useEffect } from 'react';
import Emitter from '../../emitter';
function Index() {
useEffect(() => {
console.log('mounted'); // 挂载后
const onE1 = (e) => {
console.log('mitt test', e);
};
Emitter.on('e1', onE1); // 注册事件监听器
// 返回一个清除函数,在组件卸载或effect重新运行前调用
return () => {
Emitter.off('e1', onE1); // 取消事件监听器的注册
};
}, []); // 依赖项数组为空,effect在挂载和每次更新后运行
return (
<>
BBB
</>
);
}
export default Index;
在这个修改后的代码中,当组件卸载或effect重新运行时,清除函数会取消之前注册的事件监听器,从而防止了重复注册和多次打印的问题。
本文向大家介绍JavaScript 通过POST发送和接收JSON数据,包括了JavaScript 通过POST发送和接收JSON数据的使用技巧和注意事项,需要的朋友参考一下 示例 6 提取请求承诺最初将返回Response对象。它们将提供响应头信息,但它们不直接包含响应主体,而响应主体可能尚未加载。可以使用诸如Response对象上的方法来等待响应主体加载,然后对其进行解析。.json()
问题内容: 以下打印语句将打印“ hello world”。有人可以解释吗? 而且是这样的: 问题答案: 当使用特定的种子参数(在这种情况下为或)构造的实例时,它遵循以该种子值 开头 的随机数生成算法。 每个使用相同种子构造的对象每次都会生成相同的数字模式。
我发现了下面的代码。我知道,它看起来没有这个使用看似随机数的方法那么怪异/刺激,但它似乎比这个使用大量数字的位移的方法更复杂: Ideone上的代码 输出: 它是如何工作的?它是某种形式的加密,还是有人在构造它时发疯了?
如何将数据从PHP页面发送到TCP端口? 我正在使用它,但我不能使用任何数据!还有,你知道我怎么才能暂停吗? 有什么问题?
问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如
我必须用热敏打印机打印发票收据。我用Zjiang热敏打印机打印收据。他们还提供了手册和演示项目。在演示项目中,他们使用一个库“btsdk.jar”来实现连接和打印。 我已经成功地建立了打印机和android设备之间的连接。但是没有关于文本对齐(中心、左、右)&单元格宽度、高度的指导原则。 我试过了。它只通过改变format2变量来改变文本高度。 打印信息- 发票收据