【发布时间】:2020-01-11 13:02:56
【问题描述】:
我有使用钩子的函数组件。在 useEffect 钩子中,我只想从后端获取数据并将结果存储在状态中。然而,尽管添加了 data 变量作为依赖项,useEffect 仍然会在无限循环中触发 - 即使数据没有更改。如何阻止 useEffect 连续触发?
我尝试了空数组 hack,它确实阻止了 useEffect 连续触发,但这不是所需的行为。例如,如果用户保存新数据,useEffect 应该再次触发以获取更新的数据 - 我不想模拟 componentDidMount。
const Invoices = () => {
const [invoiceData, setInvoiceData] = useState([]);
useEffect(() => {
const updateInvoiceData = async () => {
const results = await api.invoice.findData();
setInvoiceData(results);
};
updateInvoiceData();
}, [invoiceData]);
return (
<Table entries={invoiceData} />
);
};
我希望 useEffect 在初始渲染后触发,并且仅在 invoiceData 更改时再次触发。
【问题讨论】:
-
这不是和空依赖数组一样的行为吗? if (!invoiceData) updateInvoiceData();
-
如果
invoiceData中有一些值,它将继续被调用。useEffect中的第二个参数会更好地处理这个问题,并且只会在invoiceData中的值更改时执行代码。但是,如果每次您拨打电话时都会更改该值,那么这将不起作用。 -
我建议将
updateInvoiceData逻辑移动到单独的方法中,并且仅在第一次使用useEffect,然后每当保存新数据时,再次调用该方法(不要使用useEffect) -
@Trevor 你是怎么解决这个问题的?我有类似的问题。投票最多的答案指出了问题,但没有提供解决方案。
标签: reactjs react-hooks use-effect