reactjs - 中间组件生命周期 API 调用
问题描述
据我了解,获取数据被认为是一种副作用,应该在使用效果范围内。但我想知道这个规则是否可以在组件生命周期中被打破。很明显为什么 useEffect 在组件最初安装时对于获取数据很重要。之后就不太明显了。
这是我正在做的一个例子。它似乎工作正常,并且在获取数据后组件重新呈现。
function ComponentThatFetchesList() {
const [list, setList] = useState([]);
const fetchData = () => {
asyncFetchData().then(data => {
setList(list);
});
}
return (
<div>
<button onClick={fetchData}>fetch data</button>
<ui>{list.map(l => (<li>{l}</li>))}</ul>
</div>
);
}
但据我了解,获取数据被认为是副作用,应该在使用效果范围内。因此,也许建议使用以下内容(我添加了 searchText 以触发 useEffect)。
function ComponentThatFetchesList() {
const [list, setList] = useState([]);
const [searchText, setSearchText] = useState("");
useEffect(() => {
asyncFetchData(searchText).then(data => {
setList(list);
});
}, [searchText]);
return (
<div>
<input box to enter search text>
<button that sets search text>
<ui>{list.map(l => (<li>{l}</li>))}</ul>
</div>
);
}
如果我采用第一种方法,我是否有可能引入稍后发现的错误?
解决方案
欢迎@daniel-longfellow 加入 Stack Overflow
该方法看起来很好,因为数据加载发生在用户事件上。
(对于微优化,你可能会换掉fetchData
,useCallback
但如果没有性能问题,只会让它更难阅读)。
useEffect
当组件需要自动获取或状态更改时,您将使用第二个 ( )。
但由于我不知道确切的用例,您可以选择其中一个,然后再进行重构。
最后,这个问题可能不是一个好的 Stack Overflow 主题,因为它不是一个具体问题,但可以自以为是(推荐问题)。
我作为一个新的贡献者,所以不会意识到这一点。
推荐阅读
- xamarin - 如何通过传入类型参数来自定义 Xamarin 模板?
- docker - 使用 `docker inspect` 获得的层摘要与从注册表 API 获得的层摘要之间存在差异
- sql - Postgresql 排除已经存在的友谊关系
- vba - Excel VBA宏将符合条件的行复制到另一张纸上的新行
- android - WorkManager - 运行周期性任务
- node.js - Web 进程无法绑定到 $PORT heroku 使用 node.js 部署错误
- e-commerce - 如何启用 2Checkout 以接受全球所有国家/地区的账单/送货地址?
- angular - routerLinkActive 用于多条路由
- python - 如果负节点从 0 重新开始总和,则在树中找到从根到 n 元叶的最大路径总和
- c# - 线程池线程永远不会终止