尝试同时使用 EventEmitter 和 useState。我究竟做错了什么?
Trying to use an EventEmitter and useState at the same time. What am I doing wrong?
我对 ReactJS 有点陌生,但仍在努力解决问题。我目前在同时使用 useState 时使用 EventEmitter 时遇到问题。
这是我的沙箱:
https://codesandbox.io/s/vibrant-germain-q4933
如果您查看控制台并单击 "emit" 或 "child emit" 按钮,它工作正常。正在发射和接收信号。然而,一旦您点击 "child count" 按钮几次,然后返回并点击 "child emit",您就会看到事情开始重复。
这个问题似乎只有在同一个 child 中使用 useState 和 emitter.on 时才会发生。它可能与将发射器作为道具传递有关。不确定这是否是个好主意。
我在这里缺少什么概念?
谢谢
您不应在函数渲染周期内直接定义发射器实例。相反,您必须只创建和添加一次监听器事件。
要仅创建一次监听器,请使用 useRef 并仅添加一次监听器,请使用 useEffect 钩子
示例代码
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;
我对 ReactJS 有点陌生,但仍在努力解决问题。我目前在同时使用 useState 时使用 EventEmitter 时遇到问题。
这是我的沙箱: https://codesandbox.io/s/vibrant-germain-q4933
如果您查看控制台并单击 "emit" 或 "child emit" 按钮,它工作正常。正在发射和接收信号。然而,一旦您点击 "child count" 按钮几次,然后返回并点击 "child emit",您就会看到事情开始重复。
这个问题似乎只有在同一个 child 中使用 useState 和 emitter.on 时才会发生。它可能与将发射器作为道具传递有关。不确定这是否是个好主意。
我在这里缺少什么概念?
谢谢
您不应在函数渲染周期内直接定义发射器实例。相反,您必须只创建和添加一次监听器事件。
要仅创建一次监听器,请使用 useRef 并仅添加一次监听器,请使用 useEffect 钩子
示例代码
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;