当前位置: 首页 > 知识库问答 >
问题:

javascript - 我使用此代码,接收到发送过来的数据,为何会打印两次呢?

葛宏爽
2024-07-08

我使用此代码,
参考: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组件内打印了两次:
45a4db77af746b1c99e0d4b9bdd004dc.png
7ef7e5951df1506c29b95f2b11146544.png

共有1个答案

长孙景焕
2024-07-08

从您提供的代码和描述来看,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变量来改变文本高度。 打印信息- 发票收据

  • 但是,下面的代码将数据发送到打印机,当数据到达打印机队列时,它返回时带有我认为可以通过指定风味来克服这个问题,但事实并非如此

  • 问题内容: 我已经找到了这段代码,无法找出解决方法。在运行代码时,为什么不提示用户输入而不是Java确定没有输入?错误跟踪如下。 这是错误- 问题答案: 简单的答案是当您关闭扫描仪时- 基础输入流也会关闭:http : //docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close() 要修复此问题,请在主菜单中创建一次: