javascript - 警报组件不会第二次重新触发
问题描述
我创建了一个 Alert 组件,以便能够从 ReactJS 应用程序中的所有组件发送警报,并通过 Context.Provider 传递它。消息存储在状态中,状态函数作为 Context.Provider 的值传递。
但是,如果我尝试使用它一次它可以工作,但第二次就不行了。有任何想法吗?
警报.js
import React, { useEffect, useState } from "react";
import styled from "styled-components";
const StyledDiv = styled.div`
width: 100%;
height: 30px;
font-size: 1.2em;
text-align: center;
background: tomato;
`;
const Alert = ({ message }) => {
const [visible, setVisible] = useState(false);
useEffect(() => {
if (message) {
setVisible(true);
setTimeout(() => {
setVisible(false);
}, 5000);
}
},[message]);
if (visible) {
return <StyledDiv id="alert">{message}</StyledDiv>;
} else return null;
};
export default Alert;
应用程序.js
import React, { useState, createContext } from "react";
import Alert from "./components/alert/Alert";
export const AlertContext = createContext();
function App() {
const [alert, setAlert] = useState();
return (
<>
<Alert message={alert} />
<AlertContext.Provider value={setAlert}>
COMPONENTS HERE
</AlertContext.Provider>
</>
);
}
export default App;
解决方案
只需将消息作为参数放在您的 useEffect 中:
useEffect(() => {
if (message) {
setVisible(true);
setTimeout(() => {
setVisible(false);
}, 5000);
}
}, [ message ]);
这样,每次消息更改时它都会起作用。
推荐阅读
- php - 如何使用 codeigniter 更新表中的确切行
- c# - \MSBuild\16.0\Bin\Microsoft.CSharp.targets 文件未找到
- ios - 我们如何将数据写入firebase实时数据库?即使启用了读/写,似乎也不起作用
- python - 如何使用 django python 将格子连接到条纹
- amazon-web-services - AWS 使用负载均衡器设置 DNS
- swift - NSCollectionView:如何防止右键选择?
- react-native - (Android) 有没有办法在 App 不运行时从 HeadlessJS React Native 启动 App?
- javascript - 在 html div 中显示函数的结果
- google-analytics - 谷歌标签管理器、Cookiebot 和谷歌分析:在标签中从“页面视图”切换到“窗口加载”跟踪类型的后果是什么?
- asp.net-core - 在 Razor 视图中填充 selectlistitem 时同步等待 NULL 引用异常