【发布时间】:2021-11-05 18:49:48
【问题描述】:
我收到警告:“无法对未安装的组件执行 React 状态更新”,因此我尝试确定何时卸载我的组件,如下所示:
function ListStock() {
let mounted = true;
const [data, setData] = useState([]);
const [search, setSearch] = useState();
useEffect(() => {
async function fetchData() {
const {start_date, end_date} = search;
const result = await getDataStock(start_date, end_date);
if (result && mounted) {
setData(result.data); // only set a state when mounted = true
}
}
fetchData();
return () => {
mounted = false; // set false on clean up
}
}, [search])
const handleSearch = () => {
...
setSearch({
start_date: moment().subtract(1, 'month').format('YYYY-MM-DD'),
end_date: moment().format('YYYY-MM-DD')
});
}
return (
<div>
<input type="text" id="keyword">
<input type="button" onlick={handleSearch} value="Search">
{data}
</div>
)
}
通过这种方式,它可以解决该警告消息,但它显示另一个:
"从 React Hook 内部分配给 'mounted' 变量 每次渲染后 useEffect 都会丢失。为了保值 时间,将其存储在 useRef Hook 中,并将可变值保存在 '.current' 属性。否则,你可以直接移动这个变量 内部使用效果”
当我将 'mounted' 变量存储在 useRef 挂钩中时,我无法再进行搜索,因为 'mounted' 始终设置为“false”。
我的问题是:
- 为什么当用户单击搜索按钮时会运行清理代码?我认为它仅在卸载组件时运行?
- 使用远程 API 实现搜索作业的正确方法是什么?
- 如果我将 ESLint 配置为忽略所有此类警告消息可以吗?
谢谢大家。
【问题讨论】:
标签: reactjs