javascript - 如何重新渲染反应组件取决于文件?
问题描述
我有一个存储对象数组的文件。我有一个组件从这个文件中获取数据然后呈现列表。该文件可以在其他地方更新,如果文件被修改,我需要更新组件。我有以下代码示例
const header = () => {
const [list, setList] = useState([]);
// fetch
useEffect(() => {
const loadList = async () => {
const tempList = await getList("/getlist"); // get call to fetch data from file
setList(tempList);
};
loadList ();
}, [list]);
// function to render content
const renderList = () => {
return list.map(obj => (
<div key={obj.name}>
{obj.name}
</div>
));
};
return (
<div>{renderList()}</div>
)
}
// get call
router.get('/getlist',
asyncWrapper(async (req, res) => {
const result = await getList();
res.status(200).json(result).end();
})
);
const getList= async () => {
const list = JSON.parse(await fs.readFile(listPath));
return list;
}
代码已被简化。如果我从 useEffect 中删除列表,那么它只会呈现一次并且永远不会更新,除非我刷新页面。如果我在那里包含列表, loadList() 将不断被调用,并且组件将一次又一次地重新渲染。这不是我想要的行为。我只是想知道没有制作标头组件异步组件,如何仅在文件更改时重新渲染该组件?
非常感谢。
解决方案
您可以采取两种方法来解决这个问题:
轮询
每隔一段时间请求 URL,并在组件卸载时清除它。
替换loadList ()
为:
const interval = setInterval(loadList, 60000); // Adjust interval as desired
return () => clearInterval(interval)
确保响应中设置的缓存控制标头/getlist
不会阻止浏览器注意到更新。
服务器推送
删除您当前的代码以获取数据并使用 websockets 替换它,可能通过 Socket.IO。(有很多关于使用 Socket.io 和 React 的教程可以在 Google 上找到,但它涉及的内容太多,无法成为 SO 答案的一部分)。
推荐阅读
- awk - How can I cut each line in a file when it reaches a space or comma in bash?
- javascript - 如何将filePath中的特殊字符转换为在节点中上传而不会出现500错误
- c++ - 通过 CMake ExternalProject_Add 与 OpenCV 链接
- java - 工厂模式是否需要工厂方法?
- sql-server - 在 pyspark 查询中使用临时表
- c# - Marshalling "uint8_t" get zero contents
- go - 进行单元测试 - 调用数据库事务开始,不是预期的错误
- css - 有没有办法在垂直列表中制作水平列表,但也在水平列表 CSS 中制作垂直列表?
- symfony - 您好,如何强制在路由中的 te URL 中显示默认参数
- python - 获取用于 sybase DB 连接的 Python 模块