【问题标题】:After adding useDispatch, the code behind cannot be run添加useDispatch后,后面的代码无法运行
【发布时间】:2021-02-17 07:54:45
【问题描述】:

我正在使用 apisauce 为我的应用创建 api。而apisauce 有一个函数调用addMonitor,这里是:https://github.com/infinitered/apisauce#adding-monitors

但是当我将useDispatch 添加到naviMonitor 时,后面的代码无法运行。具体来说,我无法记录response。贝娄是我的Api.js:

import apisauce from 'apisauce';
import {useDispatch} from 'react-redux';

const create = () => {
    ...

    const naviMonitor = (response) => {
        const dispatch = useDispatch();
        const {status} = response || {};

        if ( (status && status === 200) ) {
            console.log(response);
        } else {
            // TODO
        }
    };

    api.addMonitor(naviMonitor);
}

我哪里错了?

谢谢你的帮助。

【问题讨论】:

  • 看起来你打破了钩子的规则。 Hook 应该位于功能组件主体的顶层。 create 是什么?能否提供一个Minimal, Complete, and Reproducible 代码示例?
  • 所以我必须将const dispatch = useDispatch() 放在const create = () 行的正下方?
  • 是的,如果create 是一个 React 组件,则在主体顶部的某个位置。用分钟代码 sn-p 很难确定。
  • 如果您仍然需要更多帮助,那么我认为包含一个更完整的代码示例将是有益的,这样我们就可以更好地了解您的用例。
  • 这是一个组件还是一个纯函数?只能在函数组件内部调用 useDispatch,否则会破坏钩子的规则。如果您想从纯函数调用调度,那么您必须访问以其他方式调度。来自您的全局商店实例,或者通过将 dispatch 作为参数传递给您的 create 函数。

标签: reactjs react-native redux react-redux


【解决方案1】:

尝试将响应对象从 API 返回到组件函数,并在那里使用 dispatch 方法,因为我们不允许使用 useDispatch 钩子或组件外部的任何反应钩子。

喜欢:

import apisauce from 'apisauce';
import {useDispatch} from 'react-redux';

const create = () => {
    ...

    const naviMonitor = (response) => {
        
        const {status} = response || {};

        if ( (status && status === 200) ) {
            console.log(response);
            return response; // process response if required.
        } else {
            // TODO
            return response; // process response if required.            
        }
    };

    api.addMonitor(naviMonitor);
}

在组件屏幕中:

import {useDispatch} from 'react-redux';

const MyComponent = props => {
    const dispatch = useDispatch();

    const actionHandler = async () => {
        const response = await create();
        dispatch(response);  // dispatch your actions here..
    }
}

【讨论】:

  • 如果我使用那个,那么每个需要调用api的函数都必须这样做?
  • 从哪里调用 apisauce 方法?
  • 我从 redux-saga 和自定义钩子 api 调用 api。
  • 我的意思是你从哪里调用传奇动作?
  • 啊。我的错,我只想检查响应的状态。如果状态为 401,则调度操作以注销应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2018-05-10
相关资源
最近更新 更多