Redux - 错误:mergeProps 的类型对象值无效

2023-12-28

我在使删除调度事件正常工作时遇到问题。我正在尝试从状态中删除列表项。

我得到的错误如下:

Error: Invalid value of type object for mergeProps argument when connecting 
component Invoices.

我是 redux 的新手,尝试过各种不同的方法。

据我所知,Redux 在 Invoices.js 上的以下几行中抛出错误

export default connect(
mapStateToProps,
mapDispatchToProps,
{ getInvoices }
)(Invoices);

如果我拿出来映射调度到属性,那么错误就会停止,但是显然我不能使用这个方法。我尝试将另一个参数设置为 null,以防它需要 mergeProps 参数(尽管它是可选的),如下:

export default connect(
mapStateToProps,
mapDispatchToProps,
null,
{ getInvoices }
)(Invoices);

但是,我似乎无法解决这个错误。

Note:一切工作正常,只是当我引入mapDispatchToProps /删除调度时我遇到了这个错误。

我有以下文件:

//Invoices.js
import React, { Component } from "react";
import { connect } from "react-redux";
import PropTypes from "prop-types";
import Spinner from "../common/Spinner";
import InvoiceItem from "./InvoiceItem";
import { getInvoices, deleteInvoice } from "../../actions/invoiceActions";

class Invoices extends Component {
componentDidMount() {
this.props.getInvoices();
}

render() {
const { invoices, loading } = this.props.invoice;
let invoiceItems;

if (invoices === null || loading) {
  invoiceItems = <Spinner />;
} else {
  if (invoices.invoices.length > 0) {
    invoiceItems = invoices.invoices.map(invoice => (
      <InvoiceItem
        key={invoice.Id}
        invoice={invoice}
        delete={this.props.delete}
      />
    ));
  } else {
    invoiceItems = <h4>No invoices found...</h4>;
  }
  }

  return (
  <div className="profiles">
    <div className="container">
      <div className="row">
        <div className="col-md-12">
          <h1 className="display-4 text-center">Invoices</h1>
          {invoiceItems}
        </div>
      </div>
    </div>
  </div>
  );
 }
}

Invoices.propTypes = {
getInvoices: PropTypes.func.isRequired,
deleteInvoice: PropTypes.func,
invoice: PropTypes.object.isRequired
};

const mapStateToProps = state => {
 return {
  invoice: state.invoices
 };
};

const mapDispatchToProps = dispatch => {
  return {
   deleteInvoice: invoice => dispatch(deleteInvoice.deleteInvoice(invoice))
  };
};

export default connect(
mapStateToProps,
mapDispatchToProps,
{ getInvoices }
)(Invoices);

.

// InvoiceItem.js
import React, { Component } from "react";
import PropTypes from "prop-types";
import { deleteInvoice } from "../../actions/invoiceActions";

class InvoiceItem extends Component {
constructor(props) {
  super(props);
 this.handleChange = this.handleChange.bind(this);
}

handleChange(e) {
 this.setState({
   name: e.target.value
  });
}

deleteInvoice(e, invoice) {
 e.preventDefault();
 this.props.deleteInvoice(invoice);
}

render() {
 const { invoice } = this.props;

  return (
  <div className="card card-body bg-light mb-3">
    <div className="row">
      <div className="col-lg-6 col-md-4 col-8">
        <h3>Invoice: {invoice.InvoiceNumber}</h3>
        <p>Client: {invoice.Contact.Name}</p>
        <button
          onClick={e => this.deleteInvoice(e, invoice)}
          className="btn btn-danger"
        />
      </div>
    </div>
  </div>
  );
 }
 }

InvoiceItem.propTypes = {
invoice: PropTypes.object.isRequired
};

export default InvoiceItem;

.

// invoicesReducer.js
import {
GET_INVOICES,
DELETE_INVOICE,
INVOICES_LOADING
} from "../actions/types";

const initialState = {
invoices: [],
loading: false
};

export default function(state = initialState, action) {
console.log(action);
switch (action.type) {
case INVOICES_LOADING:
  return {
    ...state,
    loading: true
  };
case GET_INVOICES:
  return {
    ...state,
    invoices: action.payload,
    loading: false
  };
case DELETE_INVOICE:
  return {
    invoices: state.invoices.filter(
      invoice => invoice.Id !== action.payload
    )
  };

default:
  return state;
}
}

.

// invoiceActions.js
import axios from "axios";
import { GET_INVOICES, DELETE_INVOICE, INVOICES_LOADING } from "./types";

// I have left out the GET_INVOICES action here. It's a long Axios call and 
is working fine....

// Delete Invoice
export const deleteInvoice = invoice => dispatch => {
 dispatch({
type: DELETE_INVOICE,
payload: invoice
});
};

.

// types.js
export const GET_INVOICES = "GET_INVOICES";
export const GET_INVOICE = "GET_INVOICE";
export const DELETE_INVOICE = "DELETE_INVOICE";
export const INVOICES_LOADING = "INVOICES_LOADING";

您需要从 connect 方法中删除 {getInvoices} 并将其添加到 mapStateToProps 函数中,如下所示

const mapDispatchToProps = dispatch => {
  return {
   deleteInvoice: invoice => dispatch(deleteInvoice.deleteInvoice(invoice)),
   getInvoices: actions.getInvoices // you should send your action like this
  };
};

export default connect(
mapStateToProps,
mapDispatchToProps
)(Invoices);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redux - 错误:mergeProps 的类型对象值无效 的相关文章

随机推荐

  • 在 Firefox 中加载图像时显示边框和标题

    我的火狐浏览器有问题 我的网站上有很多图片 当我在 Firefox 中浏览页面时 加载图像时边框和图像标题可见 下载完成后 该边框 标题就会消失并被图像取代 这种情况只发生在火狐浏览器中 Chrome 和其他浏览器加载没有任何边框和标题的图
  • Scala + Android 新手

    我正在尝试使用 scala andriod 插件 但在运行和配置 AVD 时遇到问题 我从 sbt 收到以下错误 android 模拟器启动 NexusOne 成功 总时间 0 s 完成 2011年11月18日 7 07 53 PM 模拟器
  • Rabbitmq 使用单个同步调用检索多条消息

    有没有办法使用单个同步调用接收多条消息 当我知道队列中有 N 条消息 N 可以是小于 10 的小值 时 我应该能够执行类似于 channel basic get String queue boolean autoAck int number
  • 通过 Crystal Web 服务以编程方式设置 Crystal Server 上 Crystal Report 的数据源

    如何更改在 Crystal 服务器中运行的 Crystal 报表在运行时使用的数据源 数据库服务器 用户名 密码 我有一台水晶服务器 并上传了具有一组数据源的报告 托管在服务器 A 用户 A 密码 A 上的 SQL Server 2005
  • Cache-Control: max-age=0 和 no-cache 有什么区别?

    标题Cache Control max age 0意味着内容立即被视为过时 并且必须重新获取 这实际上与Cache Control no cache 我有同样的问题 并在搜索中找到了一些信息 您的问题作为结果之一出现 这就是我所决定的 有两
  • sqlcipher - sqlcipher 的安全性如何?它被黑客入侵了吗?

    它在页面级别加密 SQLite 数据库 好吧 没问题 但是你的源代码呢 它已编译 但即使已编译 有人也可以反编译它 检索您的密码并解密数据库吗 SQLCipher 的安全性如何 根据SQLCipher设计文档 http sqlcipher
  • 是否有更快的代码用于向表中添加新行 - Excel VBA

    每当我的代码找到要添加到其中的新值时 我都会向表中添加一个新行 我为此使用的代码Set newRow ProjectTable ListRows Add工作正常 但这使其运行速度非常慢 是否有代码可以完成相同的任务但运行速度更快 Dim P
  • 如何在flutter中自定义标签栏宽度?

    您好 我们可以在 flutter 中自定义标签栏宽度吗 我的标签栏宽度是固定的 所以当我的标签栏中有长文本时 它不会完全显示 我想让我的标签栏宽度根据内容灵活 所以当我的文本只是短文本时 标签栏宽度会很小 当文本是长文本时 选项卡栏宽度大于
  • 来自 github 存储库的 Scala sbt 文件依赖项

    是否可以包含来自 github 的依赖项 存储库没有 jar 文件 只有 build sbt 文件和源文件夹 您可以创建一个新项目 该项目指向您的源代码build sbt然后使用dependsOn lazy val projectIDepe
  • 下标运算符中的逗号运算符?

    我对逗号运算符很困惑 我从来没有见过这样的代码和这样的语法 但我很好奇它在任何地方都有用吗 为什么它在 c 20 中被弃用 include
  • 如何创建全局热键?

    我想创建一个热键 因此当您按下时 它应该将一些字节写入我附加的进程中的内存地址 到目前为止 我有这段代码 但似乎只有当我专注于主应用程序时它才有效 否则它将无法工作 我想让它工作 所以它会做我想做的事 即使我不关注主应用程序 private
  • xlsxwriter下拉列表Excel错误

    要对特定列中的所有行应用数据验证 请使用以下顺序 import xlsxwriter workbook xlsxwriter Workbook data validate2 xlsx worksheet workbook add works
  • 冲突解决后强制在 TFS 中合并

    TFS 2010 VS 2010 我们在 TFS 中遇到了一种情况 开发人员没有遵循正确的合并程序 当我将他的开发者目录与主干进行比较时 我得到了许多标记为不同或根本不在主干中的文件 他最后一次合并 签入主干是在 2011 05 26 他最
  • CUDA 功能和 CUDA 版本:兼容吗?

    我有一台具有 1 1 计算能力 CUDA GPU 的机器 我想重新安装 CUDA 我想我会选择 5 0 CUDA 功能和 CUDA 版本之间是否存在兼容性之类的问题 将 CUDA 5 0 与 C C 1 1 一起使用时会遇到麻烦吗 图形处理
  • 如何使用 overpass-api 获取我所在点附近的兴趣点?

    我正在使用 Overpass API 我无法找到我的地点附近 大约 100 200 英里 的一些兴趣点 咖啡馆 医院 学校 我只有纬度和经度 Overpass API 提供了使用您的地名获取 POI 的机会 但我没有 我只有坐标 我怎样才能
  • 如何在 Java EE 中使用 CDI 编写 main()?

    我有一个想要运行的无客户端应用程序 它没有客户端 但会进行 HTTP 调用并充当其他服务的客户端 它可能会运行几个小时或几天 但不需要定期运行 只需一次性 我想在 Java EE 7 容器中运行它 因为标准上下文依赖注入 CD 和标准 JA
  • Django 模型定义竞赛

    如果模型 A 依赖于所定义的模型 B 但模型 B 也依赖于所定义的模型 A 那么如何处理这种情况 例如 我有 class event models Model competition start models DateField compe
  • PointerByReference 不返回值

    我正在尝试通过 JNA 从 Java 调用 C 函数 我想传入一个字符串 然后返回一个字符串 这是通过使用 in 参数和 out 参数来完成的 我用PointerByReference来代表char 输出参数 对 C 的调用有效 但是Poi
  • 让 Restangular 的 .remove 在正文与 URI 中发送数据

    我正在将 Angular REST 调用转换为使用 Restangular 在此转换期间 我只是将调用移至使用 Restangular one controller remove object 这是调用正确的 URI 和方法 DELETE
  • Redux - 错误:mergeProps 的类型对象值无效

    我在使删除调度事件正常工作时遇到问题 我正在尝试从状态中删除列表项 我得到的错误如下 Error Invalid value of type object for mergeProps argument when connecting co