如何解决React redux中的数据加载问题

2024-03-16

我试图弄清楚当数据仍在加载时如何管理/显示此组件。

我在这种情况下使用react redux。

有什么解决这个问题的建议吗?

虽然我用延迟加载来包装它,但在这种情况下似乎并没有那么有效。

对此有何建议。

//动作.js

export const getContact= () => dispatch => {
    dispatch(setResumesLoading());
    axios
        .get('/api/contacts')
        .then(res => 
            dispatch({
                type: GET_CONTACTS,
                payload: res.data
            })
        ).catch (err => dispatch (returnErrors(err.response.data, err.response.status)));
};

//组件.js

import React, {Component} from 'react';
import {Grid, Cell, List, ListItem, ListItemContent, Button} from 'react-mdl';
import { connect } from 'react-redux';
import { getContact, deleteContact} from '../../actions/resumeActions';
import PropTypes from 'prop-types';

class Contact extends Component{

    static propTypes = {
        getContact: PropTypes.func.isRequired,
        deleteContact: PropTypes.func.isRequired,
        resume: PropTypes.object.isRequired,
        isAuthenticated: PropTypes.bool,
        auth: PropTypes.object.isRequired
    }

    componentDidMount() {
        this.props.getContact();
    }

    onDeleteContactClick = (id) => {
        this.props.deleteContact(id);
    };

    render(){
        const { contacts } = this.props.resume;
        const { user } = this.props.auth;

        return(
            <div>
                {/* {loading ? <Loading /> : <ResultsComponent results={data} />} */}
                 {contacts.map(({ _id, contact_name, contact_phone, contact_email, contact_skype, contact_image }) => (
            <Grid key={_id} timeout={100} classNames="fade">

               { this.props.isAuthenticated && (user.is_admin === true) ? 
                            <Button className="remove-btn"
                            color="danger"
                            size="sm"
                            onClick= {this.onDeleteContactClick.bind(this, _id)}>
                                &times;
                            </Button> : null }
                    <Cell col={6}>
                        <div style={{textAlign: 'center'}}>
                            <h2> {contact_name} </h2>
                            <img src={contact_image}
                            alt="avatar"
                            style={{height: '40%', borderRadius: '50%', width: '50%'}}
                            img-rounded />
                        </div>

                    </Cell>
                    <Cell col={6} className="contact-right-col text-center">

                        <h2 >Contact Me</h2>
                        <hr  className="resume-left-contact-section-border" />

                        <List>
                          <ListItem>
                            <ListItemContent  className="contact-list-item">
                                <i className="fa fa-phone-square" aria-hidden="true"/>
                                {contact_phone}
                            </ListItemContent>
                          </ListItem>
                        </List>

                    </Cell>
            </Grid>
            ))} 
            </div>


        )
    }
}



const mapStateToProps = (state) => ({
    resume: state.resume,
    isAuthenticated : state.auth.isAuthenticated,
    auth: state.auth
});

export default connect(mapStateToProps, {getContact, deleteContact }) (Contact);

那么,您可以在现有的操作列表中添加另外两个操作。一种用于获取 API 调用开始的状态,另一种用于获取任何错误。有点像这样:

import * as types from "./actionTypes";

export function beginApiCall() {
  return { type: types.BEGIN_API_CALL };
}

export function apiCallError() {
  return { type: types.API_CALL_ERROR };
}

然后,您可以通过在正确的时间调度这些操作来利用它们。

export const getWorkexperience = () => dispatch => {
    dispatch(beginApiCall());
    axios
        .get('/api/workexperiences')
        .then(res => 
            dispatch({
                type: GET_WORKEXPERIENCE,
                payload: res.data
            })
        ).catch (err => dispatch(apiCallError(error)););
};

然后您必须为此操作创建一个新的减速器。为此编写一个减速器有点棘手。您需要存储正在进行的 API 调用数量,并根据其状态增加或减少它们。为此,您可以附加_SUCCESS到所有动作创建器和减速器中现有的动作类型。

import * as types from "../actions/actionTypes";
import initialState from "./initialState";

function actionTypeEndsInSuccess(type) {
  return type.substring(type.length - 8) === "_SUCCESS";
}

export default function apiCallStatusReducer(
  state = initialState.apiCallsInProgress,
  action
) {
  if (action.type == types.BEGIN_API_CALL) {
    return state + 1;
  } else if (
    action.type === types.API_CALL_ERROR ||
    actionTypeEndsInSuccess(action.type)
  ) {
    return state - 1;
  }

  return state;
}
  //initialState.js
    export default {
      state1: [],
      state2: [],
      apiCallsInProgress: 0
    };

一旦进入组件,在发出获取请求后,您可以使用此减速器的状态来渲染旋转器或任何您想要的东西,只需从减速器中获取它即可。

  const loading = useSelector((state) => state.apiCallsInProgress > 0);

或者您可以通过以下方式访问它mapStateToProps像这样,我看到你已经用它来获取组件中的道具。

const mapStateToProps = (state) => ({
    resume: state.resume,
    isAuthenticated : state.auth.isAuthenticated,
    auth: state.auth,
    loading: state.apiCallsInProgress > 0
});

你可以像这样返回函数的内容。

 {loading ? (
       Loading...
      ) : (
        <div>My component</div>
)}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决React redux中的数据加载问题 的相关文章

随机推荐

  • Swift 复合算术运算错误

    var ret 100 0 2 0 1 3 3 0 4 0 0 2 2 0 2 0 0 1 2 0 3 0 output Cannot invoke with an argument list of type T24 T31 当我执行上面的
  • JSF2.0 在托管 bean 之间传递值对象

    我已经使用 Weblogic 10 3 4 PrimeFaces 和 JQuery 编写了一个小型 JSF2 0 应用程序 我现在正在考虑将我们的主 Web 应用程序转换为 JSF2 0 目前这是使用Weblogic 8 1 Java 1
  • 在多个并发上游作业成功后,如何启动 Jenkins 作业?

    为了获得尽可能快的反馈 我们有时希望 Jenkins 作业并行运行 当作业完成时 Jenkins 能够启动多个下游作业 或 分叉 管道 然而 詹金斯似乎没有任何方法可以使下游作业仅在该分叉的所有分支成功开始 或将分叉重新 连接 在一起 詹金
  • jquery 使用变量分配和调用 ID [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 假设我有下
  • Java 时态库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 Java 的临时库 即允许存储同一概念的多个历史版本的库 我正在寻找一个具有 API 的库来执行以下操作 Instant i1
  • Scala 宏的静态返回类型

    所以我有这个宏 import language experimental macros import scala reflect macros Context class Foo class Bar extends Foo def laun
  • Google AppEngine 上的 Django 与 CloudSQL:如何连接数据库(错误 2002,无法连接到本地 MySQL 服务器..)

    我正在尝试使用 CloudSQL 启动一个托管在 GAE 上的 Django 应用程序 在本地 我使用 Mac OSX Maverics 在 virtualenv 中工作 通过 virtualenvwrapper 安装适用于 Python
  • URLConnection getContentLength() 返回负值

    这是我的代码 url paths 0 HttpURLConnection connection HttpURLConnection url openConnection int length connection getContentLen
  • ASP.NET Core 中的模型绑定将下划线映射到标题大小写属性名称

    我有一个模型类 我想在 ASP NET MVC Core RC2 应用程序中将查询字符串绑定到该模型类 我需要在查询字符串键中支持下划线以确认 OAuth 规范 但我想在我的应用程序中使用标题大小写属性名称 我的模型类如下所示 class
  • 将 WordPress 网站迁移到新域

    我有一个WordPress 网站 with Hostgator 虚拟主机 我正在购买新域名 并希望使用新域名作为网站 但现有的已开发网站相同 如何backup现有站点 然后恢复到新域 解决方案在这里 经过大量搜索后 我得到了一个简单的解决方
  • 在此示例中,“折叠为唯一的‘x’值”是什么意思?

    下面的示例图会产生有关以下内容的警告 In regularize values x y ties missing ties na rm na rm collapsing to unique x values 我无法弄清楚这在我的例子中意味着
  • ruby方法名的大小写规则是什么?

    我是一个 Ruby 初学者 从书中 我知道 Ruby 方法名称应该以小写字母或下划线开头 但我发现了不同的场景 如果一个方法在类外部定义 它只能以小写字母开头 如果你尝试定义一个以大写字母开头的方法 Ruby 会报错 例如 define s
  • Microsoft 的数据库命名约定?

    I found 命名指南 http msdn microsoft com en us library ms229045 aspx来自MSDN 但是微软有关于MSSQL数据库的指南吗 SQL Server 中使用的命名约定冒险工场 https
  • 跟踪 Postgres 中一行的最后修改时间戳

    在 Postgres 中 我想存储表的上次更新 插入时间 Microsoft SQL Server 提供了一种类型timestamp由数据库自动维护 But timestamp在 Postgres 中 工作方式不同 它不会自动更新 并且列始
  • 将行添加到数据框中,并包含组内数据的总和

    我下面有一个示例数据框 eg data lt data frame time c 1 1 2 2 type c long short long short size c 200 50 500 150 我需要创建行来汇总每个时间段的大小值 我
  • 名称值对已弃用

    由于 Android 22 NameValuePair 已被弃用 The 文档 http developer android com reference org apache http message BasicNameValuePair
  • 监控所有使用网络的应用程序建立的连接的 IP 地址,无需 root Android 手机

    我正在尝试构建一个 Android 应用程序 无需 root 手机 该应用程序从所有应用程序与手机之间的网络连接收集 IP 地址 我负责这个项目 关键点是手机必须保持未root状态 这 据我所知 意味着我不能使用tcpdump或libpca
  • npm 5.4.1 安装/卸载全部失败

    我使用的是 Windows 10 我通过执行以下操作升级了我的 npmnpm i g npm 但是没有软件包正在安装或卸载 安装时它始终挂在安装后 如下所示 PS C Users Mercurius Documents GitHub cat
  • 如何在wpf画布控件中添加动态设计的用户控件时获取高度和宽度?

    您好 我正在开发一个 wpf 应用程序 我正在画布中添加 myUserControl 对象 我需要高度和添加的用户控制 现在的问题是用户控件是动态设计的 我正在创建网格并根据用户配置添加行和列 并且我在高度和宽度上给出自动 所以我在画布中添
  • 如何解决React redux中的数据加载问题

    我试图弄清楚当数据仍在加载时如何管理 显示此组件 我在这种情况下使用react redux 有什么解决这个问题的建议吗 虽然我用延迟加载来包装它 但在这种情况下似乎并没有那么有效 对此有何建议 动作 js export const getC