RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1437832
Accepted
elarri
elarri
Asked:2022-08-09 23:41:07 +0000 UTC2022-08-09 23:41:07 +0000 UTC 2022-08-09 23:41:07 +0000 UTC

对 redux 服务器的两个请求

  • 772

我需要向服务器发出两个连续请求:
getAllPersons,然后是 getPersonsForSelect。

当应用程序加载时,这些请求应该发送到服务器,我使用 useEffect 使它们:

  useEffect(() => {
    dispatch(getAllPersons(mainPersonId))
    dispatch(getPersonsForSelect(processName))
  },[])

  const allbossPerson = useSelector(store => { return store.persons.allbossPerson })
  const personsForSelect = useSelector(store => { return store.persons.personsForSelect })

问题是使用 console.log() 我得到每台服务器的两次点击,即 共 4 个:

import {
    GET_ALL_PERSONS,
    GET_PERSONS_FOR_SELECT
} from "../types/person"

const initialState = {
    allbossPerson: [],
    personsForSelect: []
}

export const persons = (state = initialState, action) => {
    switch (action.type) {
        case GET_ALL_PERSONS:
            console.log('GET_ALL_PERSONS')
            const allPersons = action.allPersons.slice();
            return {
                ...state,
                allbossPerson: allPersons
            }
        case GET_PERSONS_FOR_SELECT:
            console.log('GET_PERSONS_FOR_SELECT')
            const personsForSelect = action.personsForSelect.slice();
            return {
                ...state,
                personsForSelect: personsForSelect
            }
            default:
                return state
    }
}

那些。在控制台中,我有这张图片:

GET_PERSONS_FOR_SELECT
2personReducer.js:14 GET_ALL_PERSONS
personReducer.js:21 GET_PERSONS_FOR_SELECT

我究竟做错了什么?为什么他们被调用了 2 次?

reactjs redux
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    Listopad02
    2022-08-10T16:37:26Z2022-08-10T16:37:26Z

    组件的双重渲染对于 React 来说是一个标准的事情。这是因为在开发过程中它可以帮助找到一些错误。目前您的代码是这样工作的:

    渲染组件 -> 发出 2 个请求 -> 重新渲染组件 -> 重新发出 2 个请求

    这种行为显然对我们不利,因此有几种方法可以避免它。
    1 方式 - 禁用严格模式。为此,您需要打开 index.js 文件,它看起来像这样(它可能对您有所不同,我从我的项目中获取):

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import { BrowserRouter } from 'react-router-dom';
    import { Provider } from 'react-redux';
    import store from './redux/reducers/rootReducer';
    
    const app = <Provider store={store}>
                  <BrowserRouter>
                    <React.StrictMode>   // строгий режим
                      <App />
                    </React.StrictMode>
                  </BrowserRouter>
                </Provider>
                
    ReactDOM.render(
      app, document.getElementById('root')
    );
    
    reportWebVitals();
    

    您所要做的就是注释掉 <React.StrictMode> 行(或完全删除它们),严格模式将被禁用。也就是说,该文件应如下所示:

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import { BrowserRouter } from 'react-router-dom';
    import { Provider } from 'react-redux';
    import store from './redux/reducers/rootReducer';
    
    const app = <Provider store={store}>
                  <BrowserRouter>
                    {/* <React.StrictMode> */}
                      <App />
                    {/* </React.StrictMode> */}
                  </BrowserRouter>
                </Provider>
                
    ReactDOM.render(
      app, document.getElementById('root')
    );
    
    reportWebVitals();
    

    另一种选择是构建项目,它不能完全解决问题,但可以确保一切正常。构建是项目的最终组装,也就是说,它将让您有机会以将在 Internet 上发布的形式查看项目。为此,请停止 localhost,然后使用npm run build或yarn build重新开始。当我们构建一个项目时,严格模式会自动关闭,这让我们有机会查看进行了多少渲染

    • 1

相关问题

  • 如果图像在道具中,如何使背景图像做出反应?

  • 项目未显示

  • 引发错误:InvalidTokenError: Invalid token specified: Cannot read property 'replace' of undefined

  • 如何在没有 node.js 的情况下运行 react.js 应用程序

  • 如何从 React Native 中的导航堆栈中清除上一个屏幕?

  • 为什么渲染后会触发 Click 事件?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5