代码之家  ›  专栏  ›  技术社区  ›  Piotr Chmielowiec

组件从一个调度发出两个api调用

  •  0
  • Piotr Chmielowiec  · 技术社区  · 3 年前

    我有一个问题,我的组件正在进行两个api调用,而不是一个。我正在将react和react-redux与reactjs/toolkit一起使用。我尝试了不同的解决方案,比如在useEffect钩子中更改依赖性数组,更改请求头,查看整个代码库以找到另一个调用。什么都没用。 我也试过了,但没用。 Why does my fetch query run multiple times in my React component

    我希望这段代码在安装组件后不久调用一次api。

    Redux开发工具显示有两个api调用。一个接一个。 Sceenshoot of actions in dev tools.

    useEffect(() => {
        dispatch(fetchPosts('hot', ''));
      }, [dispatch]);
    

    https://github.com/chpiotr06/Reddit-minimal/tree/dev

    抓取thunk如下所示:

    export const fetchPosts = createAsyncThunk(
      'wall/fetchPosts',
      async (type, querry) => {
        const response = await Reddit.fetchPosts(type, querry);
        const data = await response.json();
        return data;
      }
    )
    

    Reddit。获取帖子(正在进行中):

    const Reddit = {
      fetchPosts: (type, querry) => {
        return fetch(`https://www.reddit.com/${type}.json`, {
          method: 'GET',
          mode: 'cors',
        })
      },
    }
    
    1 回复  |  直到 3 年前
        1
  •  0
  •   Moira    3 年前

    不确定这是否是正确的猜测,但这可能与strictmode有关吗?如果你发表评论 <React.StrictMode>

    编辑: 很高兴我能帮忙!

    我对react-strict模式做了一些研究,并想在这里分享我的发现。严格模式可以帮助您在开发模式下调试代码(它对生产没有影响,所以如果您发现组件渲染两次,就不用担心)。一般来说,打开它被认为是最佳做法,因为它将有助于检测不推荐使用的代码并发现不必要的副作用。

    在传统意义上卸载(从组件树中删除),但只是对用户隐藏。React仍然会调用相同的旧卸载函数来告诉组件它正在被隐藏,但它也会保存其状态,以将组件恢复到与以前相同的屏幕上。这意味着,如果某个效果没有正确清理订阅,其状态仍然存在,并且react saved状态将添加到Reender的顶部。

    <反应模式>

    进一步阅读:

    在上有一个非常有趣的帖子 https://github.com/reactwg/react-18/discussions/19

    当然,文件: https://reactjs.org/docs/strict-mode.html#ensuring-reusable-state

    推荐文章