- 此问题在此处已有答案**:
(9个答案)
5小时前关门了。
我尝试使用提供程序和钩子显示多条消息。但是我不能显示多条消息。一条消息一次显示一条消息,不知道为什么?
下面是我代码https://codesandbox.io/s/new-mountain-cnkye5?file=/src/App.tsx:274-562
React.useEffect(() => {
setTimeout(() => {
utilContext.addMessage("error 2 sec");
}, 300);
setTimeout(() => {
utilContext.addMessage("error 5 mili sec");
}, 2000);
setTimeout(() => {
utilContext.addMessage("error 1 sec");
}, 1000);
}, []);
我还使用Map功能来呈现所有的消息。
return (
<>
{messages.map((msg, index) => (
<div key={`Toast-Message-${index}`}>
{msg.msg}
<button
onClick={(event) => {
alert("000");
}}
>
close
</button>
</div>
))}
<ConfirmationDialogContext.Provider value={value}>
{children}
</ConfirmationDialogContext.Provider>
</>
);
- 预期产出**:一段时间后它将显示3条消息。
2条答案
按热度按时间ygya80vv1#
更改您的
到
这是因为您同时调用了3个
addMessage
,因此messages
变量在所有三个调用中都具有相同的值。有关此语法的详细信息,请参阅基于先前状态更新状态
t9aqgxwy2#
每次添加消息时,上下文都会发生变化,而在
useEffect
依赖项中,上下文并不作为dep,这意味着您只向第一个上下文示例添加消息,而始终呈现最新的上下文示例。但是,如果您将上下文添加到
useEffect
依赖项中,则会出现无限循环。一个(不好)的解决方案是使用
useRef
跟踪每个setTimeout
,如下所示:我认为,您应该将信息呈现的延迟从发送者转移到上下文中,如下所示: