Вы не должны определять свои экземпляры эмиттера непосредственно в цикле рендеринга функции. Вместо этого вы должны создавать и добавлять события списка только один раз.
Чтобы создать список только один раз, используйте useRef, а чтобы добавить список только один раз, используйте useEffect hook
Пример кода
const App = props => {
const myEmitter = useRef(new EventEmitter());
const [counter, setCounter] = useState(0);
useEffect(() => {
myEmitter.current.on("event", msg => {
console.log("Parent received: " + msg);
});
}, []);
const Send = () => {
myEmitter.current.emit("event", "parent sending this message.");
};
return (
<Content>
<button onClick={Send}>emit</button>
<button onClick={() => setCounter(counter + 1)}>count {counter}</button>
<Child myEmitter={myEmitter.current} />
</Content>
);
};
import React, { useState, useEffect } from "react";
const Child = props => {
const [counter, setCounter] = useState(0);
useEffect(() => {
props.myEmitter.on("event", msg => {
console.log("Child received: " + msg);
});
}, [props.myEmitter]);
const Emit = () => {
props.myEmitter.emit("event", "child sending this message");
};
return (
<>
<button onClick={Emit}>child emit</button>
<button onClick={() => setCounter(counter + 1)}>
child count {counter}
</button>
</>
);
};
export default Child;
Демо