在状态更改(由 useState 的更新程序)成功应用后,我如何 运行 某些代码?
How can I run certain code after the change (by useState's updater) to state has been applied successfully?
我有一个选择框,其中包含客户列表和该客户的车辆列表,显示在选择框下方。当Selectbox中的客户更改时,我需要更新车辆列表,并显示加载程序,直到我们从服务器中获得了新车辆的响应。
vehicles === null
(车辆未装载)时显示装载机。
这是我的代码:
const [vehicles, setVehicles] = useState(null);
useEffect(() => {
// setting vehicles to null to show the loader
setVehicles(null);
axios
.get(`/vehicles?customerId=${customer.id}`)
.then((response) => setVehicles(response.data));
}, [customer]);
它工作得很好,但我不确定在不先确保 vehicles
实际上已设置为 null
的情况下触发请求是否安全。在 setVehicles(response.data)
覆盖状态之后 setVehicles(null)
以某种方式被执行在理论上不会发生吗?
如果是这样,我该如何处理这种情况?我找不到向 setVehicles
提供 .then
或向其传递回调的方法,就像使用基于 class 的组件一样。
我可能可以在客户更改时调用 setVehicles(null)
而无需触发请求,然后让另一个 useEffect
监视对 vehicles
的更改,并在 vehicle
收到时触发加载车辆的请求设置为 null
。但这感觉不必要地复杂,所以我想知道是否有更好的方法来做到这一点?或者我是否可以保留代码,因为它希望因为 setVehicles(null)
首先被安排,所以它的状态应该总是在 setVehicles(response.data)
之前应用?
非常感谢!
您可能在同一 useEffect
中出现连续 setState
的竞争条件。为了避免这个问题,你确实必须分解并创建另一个 useEffect
,你无法逃避。
不过,根据您的示例,竞争条件不会真正发生。您有一个 setState
仅在 http 请求解析后触发,这需要一些时间。第二次状态更新实际上无法击败立即触发的第一次状态更新。
我有一个选择框,其中包含客户列表和该客户的车辆列表,显示在选择框下方。当Selectbox中的客户更改时,我需要更新车辆列表,并显示加载程序,直到我们从服务器中获得了新车辆的响应。
vehicles === null
(车辆未装载)时显示装载机。
这是我的代码:
const [vehicles, setVehicles] = useState(null);
useEffect(() => {
// setting vehicles to null to show the loader
setVehicles(null);
axios
.get(`/vehicles?customerId=${customer.id}`)
.then((response) => setVehicles(response.data));
}, [customer]);
它工作得很好,但我不确定在不先确保 vehicles
实际上已设置为 null
的情况下触发请求是否安全。在 setVehicles(response.data)
覆盖状态之后 setVehicles(null)
以某种方式被执行在理论上不会发生吗?
如果是这样,我该如何处理这种情况?我找不到向 setVehicles
提供 .then
或向其传递回调的方法,就像使用基于 class 的组件一样。
我可能可以在客户更改时调用 setVehicles(null)
而无需触发请求,然后让另一个 useEffect
监视对 vehicles
的更改,并在 vehicle
收到时触发加载车辆的请求设置为 null
。但这感觉不必要地复杂,所以我想知道是否有更好的方法来做到这一点?或者我是否可以保留代码,因为它希望因为 setVehicles(null)
首先被安排,所以它的状态应该总是在 setVehicles(response.data)
之前应用?
非常感谢!
您可能在同一 useEffect
中出现连续 setState
的竞争条件。为了避免这个问题,你确实必须分解并创建另一个 useEffect
,你无法逃避。
不过,根据您的示例,竞争条件不会真正发生。您有一个 setState
仅在 http 请求解析后触发,这需要一些时间。第二次状态更新实际上无法击败立即触发的第一次状态更新。