javascript - useState 中的默认值未重新初始化
问题描述
我有一个snack bar component
,它会显示一条 toast 消息几秒钟然后消失。我有一个App component
包含 的button
,点击它button
,我想控制snack bar component
。第一次单击时,snack bar
显示正常并在指定时间结束后消失。但是当我再次单击它时,snack bar
不会出现。我show state
每次都将其初始化为真,但仍然snack bar
没有出现。请告诉我哪里出了问题以及如何纠正这个问题。以下是文件。我正在使用自定义挂钩来控制小吃店外观的行为。
应用程序.js
import React, { useState } from "react";
import { Snackbar } from "./Snackbar";
function App() {
const [display, setDisplay] = useState(false);
return (
<div>
<button onClick={() => setDisplay(true)}>Click me</button>
{display && <Snackbar message="hello" />}
</div>
);
}
export default App;
小吃吧.js
import React from "react";
import { useSnackbar } from "./useSnackbar";
const Snackbar = ({ message }) => {
const { showSnackbar } = useSnackbar();
return (
showSnackbar && (
<div>
<p>{message}</p>
</div>
)
);
};
export { Snackbar };
使用Snackbar.js
import { useState, useEffect } from 'react';
const useSnackbar = () => {
const [showSnackbar, setSnackbar] = useState(true);
const [snackbarMessage, setSnackbarMessage] = useState('');
useEffect(() => {
const timer = setTimeout(() => {
setSnackbar(false);
setSnackbarMessage('');
}, 3000);
return () => {
clearTimeout(timer);
};
}, [showSnackbar]);
return {
showSnackbar,
setSnackbar,
snackbarMessage,
setSnackbarMessage
};
};
export { useSnackbar };
解决方案
确实,useSnackbar
钩子的默认值是true
forshowSnackbar
并且它确实false
在 3 秒后更改为,但display
inApp.js
保持不变true
,这意味着即使在timeout
.
由于display
never 设置为false
,Snackbar
因此永远不会卸载,因此状态useSnackbar
永远不会重新初始化。
我的建议是改变使用方式的结构useSnackbar
。
我会搬进useSnackbar
去App.js
并在那里设置小吃店的开放状态。
function App() {
const { showSnackbar, setSnackbar } = useSnackbar();
return (
<div>
<button onClick={() => setSnackbar(true)}>Click me</button>
{showSnackbar && <Snackbar message="hello" />}
</div>
);
}
const useSnackbar = () => {
const [showSnackbar, setSnackbar] = useState(false);
// rest of code
};
const Snackbar = ({ message }) => (
<div>
<p>{message}</p>
</div>
);
还有其他方法可以构建组件,但对于您的示例,这将是最简单的解决方案之一。
推荐阅读
- python - 在 __post_init__ 中更改类型的数据类属性的类型提示
- r - 如何将特定因子水平删除为 r 中的缺失值?
- flutter - 如何在flutter-web中将触摸事件监听器标记为被动?
- java - BST中的搜索操作
- reactjs - reactjs 和 axios:如何确保只有在几次 axios 调用成功后才加载对话框
- vector - 访问和修改向量中元素的不同方法之间的差异
- ssreflect - ssreflect 的“反转”策略:我应该使用什么?
- facebook-opengraph - 在 iOS WhatsApp 中显示链接的打开图元标记
- flutter - 如何删除列内小部件之间的空间 - Flutter
- react-native - 使用带有 flexWrap 的容器内部空间(React-Native)时,儿童溢出