使用 Redux Thunk 时正确理解 useEffect 中的依赖数组

Proper understanding of dependency array in useEffect when working with Redux Thunk

我开始学习 Redux 和 thunk 库。

我有一个 Actions.js 包含以下功能:

export const fetchInventory = (user_id) => {
return (dispatch) => {
    dispatch(fetchInventoryData());
    fetch("url", {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
      },

      //make sure to serialize your JSON body
      body: JSON.stringify({ user_id }),
    })
      .then((res) => res.json())
      .then((res) => {
        saveInventory(res);
        dispatch(fetchInventorySuccess(res));
      })
      .catch((err) => dispatch(fetchInventoryFailure(err)));
  };
};

和一个Container.js,useEffect如下:

  useEffect(() => {
    if (inventory.inventoryData.length > 0) return;
    else if (user_id) fetchInventory(user_id);
    else return [];
  }, [user_id]);

EsLint 警告我缺少依赖项数组中的 fetchInventory 和 inventory。但是,由于库存是此提取将更新的状态,包括它会使我们陷入无限提取。此外,此处必需的 user_id 是来自在此请求之前的获取请求的内容。在这种情况下,什么会进入依赖数组,为什么?

inventory 当然应该包含在依赖项数组中,因为它在钩子回调中被 引用 (也可能是 fetchInventory 动作创作者,出于同样的原因)。

我认为这里的问题是不正确的保护条款(即条件),您正在为此调用更新状态(和依赖项)的回调。

if-else-if-else 是问题所在。当第一个条件失败时,因为 inventory.inventoryData.length 不为零,检查第二个条件,并且确定有一个定义的 user_id 值并调用回调。

据我所知,你想要的条件是“如果没有库存数据AND那里一个用户id,然后获取库存,否则什么都不做"。 =16=]

尝试简化您的条件和分支因子。

useEffect(() => {
  if (!inventory.inventoryData.length && user_id) {
    fetchInventory(user_id)
  }
}, [fetchInventory, inventory.inventoryData, user_id]);