社区首页 >问答首页 >mapDispatchToProps调度操作仅适用于一个功能

mapDispatchToProps调度操作仅适用于一个功能
EN

Stack Overflow用户
提问于 2021-08-31 15:16:36
回答 1查看 27关注 0票数 1

我有两个函数,它们只在状态中的不同数组中做相同的事情

没有明显的原因,它们中只有一个可以工作,只有addToCart函数可以工作

我不能理解为什么addToWishList函数不工作

主元件

代码语言:javascript
代码运行次数:0
复制
import React, { useEffect, useState } from "react";
import { makeStyles } from "@material-ui/core/styles";
import Card from "@material-ui/core/Card";
import CardActionArea from "@material-ui/core/CardActionArea";
import CardActions from "@material-ui/core/CardActions";
import CardContent from "@material-ui/core/CardContent";
import CardMedia from "@material-ui/core/CardMedia";
import Button from "@material-ui/core/Button";
import Typography from "@material-ui/core/Typography";
import { useHistory } from "react-router-dom";
import { connect } from "react-redux";
import { addToCart } from ".././redux/Shopping/shopping-action";
import { addToWishList } from ".././redux/Shopping/shopping-action";

const useStyles = makeStyles({
  root: {
    maxWidth: 345,
  },
  media: {
    height: 240,
  },
});

function Home({ addToCart }) {
  const classes = useStyles();
  const history = useHistory();
  const [products, setProducts] = useState([]);

  useEffect(() => {
    fetch("https://fakestoreapi.com/products")
      .then((res) => res.json())
      .then((json) => setProducts(json));
  }, []);
  return (
    <div>
      <h1>ALL PRODUCTS</h1>

      <div className="cards ">
        {products.map((product) => {
          return (
            <div className="card">
              <Card className={classes.root}>
                <CardActionArea
                  onClick={() => history.push(`/product/${product.id}`)}
                >
                  <CardMedia className={classes.media} image={product.image} />
                  <CardContent>
                    <Typography gutterBottom variant="h5" component="h2">
                      {product.title}
                    </Typography>
                    <Typography
                      variant="body2"
                      color="textSecondary"
                      component="h2"
                    >
                      {product.category}
                    </Typography>
                  </CardContent>
                </CardActionArea>
                <CardActions>
                  <Button
                    onClick={() => addToCart(product)}
                    size="small"
                    variant="contained"
                    color="primary"
                  >
                    ADD TO CART ?
                  </Button>
                  <Button
                    onClick={() => addToWishList(product)}
                    size="small"
                    variant="contained"
                    color="secondary"
                  >
                    Add to wish list ❤️
                  </Button>
                </CardActions>
              </Card>
            </div>
          );
        })}
      </div>
    </div>
  );
}

const mapDispatchToProps = (dispatch) => {
  return {
    addToCart: (product) => dispatch(addToCart(product)),
    addToWishList: (product) => dispatch(addToWishList(product)),
  };
};

export default connect(null, mapDispatchToProps)(Home);

shopping-action.js

代码语言:javascript
代码运行次数:0
复制
import * as actionTypes from "./shopping-types";

export const addToCart = (item) => {
  return {
    type: actionTypes.ADD_TO_CART,
    payload: {
      item: item,
    },
  };
};

export const removeFromCart = (itemId) => {
  return {
    type: actionTypes.REMOVE_FROM_CART,
    payload: {
      id: itemId,
    },
  };
};

export const adjustQty = (itemId, value) => {
  return {
    type: actionTypes.ADJUST_QTY,
    payload: {
      id: itemId,
      qty: value,
    },
  };
};

export const addToWishList = (item) => {
  console.log(item);
  return {
    type: actionTypes.WISH_LIST,
    payload: {
      item: item,
    },
  };
};

shopping-reducer.js

代码语言:javascript
代码运行次数:0
复制
import * as actionTypes from "./shopping-types";
const INITIAL_STATE = {
  cart: [],
  wishList: [],
};

const shopReducer = (state = INITIAL_STATE, action) => {
  console.log(action.type);
  switch (action.type) {
    case actionTypes.ADD_TO_CART:
      const item = action.payload.item;
      const isInCart = state.cart.find((item) =>
        item.id === action.payload.item.id ? true : false
      );
      return {
        ...state,
        cart: isInCart
          ? state.cart.map((item) =>
              item.id === action.payload.item.id
                ? { ...item, qty: item.qty + 1 }
                : item
            )
          : [...state.cart, { ...item, qty: 1 }],
      };
    case actionTypes.REMOVE_FROM_CART:
      return {
        ...state,
        cart: state.cart.filter((item) => item.id !== action.payload.item.id),
      };
    case actionTypes.ADJUST_QTY:
      return {
        ...state,
        cart: state.cart.map((item) =>
          item.id === action.payload.item.id
            ? { ...item, qty: action.payload.qty }
            : item
        ),
      };
    case actionTypes.WISH_LIST:
      const itemForWish = action.payload.item;
      const isInWish = state.cart.find((item) =>
        item.id === action.payload.item.id ? true : false
      );
      return {
        ...state,
        wishList: isInWish ? null : [...state.wishList, { itemForWish }],
      };
    default:
      return state;
  }
};

export default shopReducer;

shopping-types.js

代码语言:javascript
代码运行次数:0
复制
export const ADD_TO_CART = "ADD_TO_CART";
export const REMOVE_FROM_CART = "REMOVE_FROM_CART";
export const ADJUST_QTY = "ADJUST_QTY";
export const WISH_LIST = "WISH_LIST";

耽误您时间,实在对不起!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-31 15:25:50

您忘记了解析由connect HOC注入的addToWishList属性,所以您直接调用操作创建器,而不是调用dispatch中包装的那个。

代码语言:javascript
代码运行次数:0
复制
import { connect } from "react-redux";
import { addToCart } from ".././redux/Shopping/shopping-action";
import { addToWishList } from ".././redux/Shopping/shopping-action"; // <-- (1) imported

function Home({ addToCart }) { // <-- (3) not destructured
  ...
  return (
    <div>
      <h1>ALL PRODUCTS</h1>

      <div className="cards ">
        {products.map((product) => {
          return (
            <div className="card">
              <Card className={classes.root}>
                ...
                <CardActions>
                  <Button
                    onClick={() => addToCart(product)}
                    ...
                  >
                    ADD TO CART ?
                  </Button>
                  <Button
                    onClick={() => addToWishList(product)} // <-- (4) non-wrapped action
                    ...
                  >
                    Add to wish list ❤️
                  </Button>
                </CardActions>
              </Card>
            </div>
          );
        })}
      </div>
    </div>
  );
}

const mapDispatchToProps = (dispatch) => {
  return {
    addToCart: (product) => dispatch(addToCart(product)),
    addToWishList: (product) => dispatch(addToWishList(product)), // <-- (2) injected
  };
};

export default connect(null, mapDispatchToProps)(Home);

要解决此问题,您应该解构并使用正确包装的操作。

代码语言:javascript
代码运行次数:0
复制
function Home({ addToCart }) {

应该是

代码语言:javascript
代码运行次数:0
复制
function Home({ addToCart, addToWishList }) {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69006192

复制
相关文章
[开源包]DisCoPy:Python 中的幺半群范畴
我们介绍了 DisCoPy,这是一个用于计算幺半群类别的开源工具箱。这个库提供了一个直观的语法来定义字符串图表和幺正函子。它的模块化允许在范畴理论的各种应用中有效地实现计算实验,在这些应用中,图已经成为通用语言。作为一个例子,我们首次使用 DisCoPy 在量子硬件上进行自然语言处理。
CreateAMind
2022/06/10
6980
[开源包]DisCoPy:Python 中的幺半群范畴
Scala教程之:可扩展的scala
隐式类是在scala 2.10中引入的,隐式类指的是用implicit关键字修饰的类。在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换。
程序那些事
2020/07/07
1.2K0
Scala中的构造器与对象【文末加群学习哦】
在《大数据之脚踏实地学19--Scala中类的使用》中我们详细介绍了Scala中类的使用,通过类的构造,借助于new关键词创建不同的实例化对象,进而实现代码的可复用性。在本期我们将继续介绍跟类相关的另外两个主题,即构造器和单例对象。
1480
2019/05/23
6190
可扩展的编程语言——Scala
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
栗筝i
2022/12/01
7640
Scala中的语言特性是如何实现的?
image.png #思特沃克好声音# (图片:网络) 我们学东西不止要知其然,还要知其所以然。成都办公室的崔鹏飞在学Scala的时候,不止学习如何使用Scala,也研究了Scala中的语言特性是如何实现的。 Scala中的语言特性是如何实现的(1) Scala可以编译为Java bytecode和CIL,从而在JVM和CLI之上运行。Scala有很多在Java和C#的世界中显得陌生的语言特性,本文将分析这些语言特性是如何实现的。 object Scala中可以像这样创建object: image.png
ThoughtWorks
2018/04/16
1K0
Scala中的语言特性是如何实现的?
【DB笔试面试589】在Oracle中,什么是半连接(Semi Join)?
半连接(Semi Join)是一种特殊的连接类型,当做子查询展开时,Oracle经常会把那些外部WHERE条件为EXISTS、IN或= ANY的子查询转换为对应的半连接。半连接分为嵌套循环半连接(Hint为:NL_SJ)、排序合并半连接(Hint为:MERGE_SJ)和哈希半连接(Hint为:HASH_SJ),不过在新版本数据库里,都倾向于使用哈希半连接。不过哈希半连接也有一些限制条件,例如,只能使用等值连接、不能使用GROUP BY、CONNECT BY、ROWNUM等限制条件。在执行计划中若有关键字“HASH JOIN SEMI”,则说明Oracle使用了哈希半连接。示例如下所示:
AiDBA宝典
2019/09/29
1.2K0
【推荐阅读】将数据可续是商业结合的原力
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
钱塘数据
2018/03/05
5260
【推荐阅读】将数据可续是商业结合的原力
【报告下载】将数据可续是商业结合的原力
?
钱塘数据
2018/03/02
5950
【报告下载】将数据可续是商业结合的原力
【Scala篇】--Scala中的函数
Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。
LhWorld哥陪你聊算法
2018/09/13
1.5K0
【Scala篇】--Scala中的函数
在Vue的webpack中结合runder函数
npm i vue-loader vue-template-compiler -D
Dream城堡
2018/12/12
1.2K0
C++核心准则​T.46:要求模板参数最少是正规或半正规的
Readability. Preventing surprises and errors. Most uses support that anyway.
面向对象思考
2020/09/10
8190
在Scala中构建Web API的4大框架
       Scala是一种强大的语言,很快就成为许多开发人员的最爱。然而,语言只是一个起点 - 并非每个函数都将由语言核心覆盖。Scala还创建了一些厉害的框架。接下来看看Scala的4个强大框架以及其优点和缺点。请记住,框架的最佳选择总是应符合您特定项目的要求——因此,请酌情考虑我们的推荐,根据您自己的项目要求决定最适合您的项目。
数据星河
2018/11/15
2.1K0
在Vue中创建可重用的 Transition
Vue.js中的transition确实很棒。 毫无疑问,它们可以非常轻松地让应用程序栩栩如生,但是通常必须在每个项目中从头开始编写它们,甚至还需要引入animate.css之类的CSS库来使它们功能更强大。
前端小智@大迁世界
2020/06/04
9.8K0
在Vue中创建可重用的 Transition
Scala 高阶(九):Scala中的模式匹配
本次主要分享Scala中关于模式匹配的内容,Scala中的模式匹配类似于Java中的switch语法,但是Scala在基于Java的思想上补充了特有的功能。
百思不得小赵
2022/12/01
1.5K0
Scala 高阶(十):Scala中的异常处理
throws与try…catch如何选择? 需要上报异常使用throws,需要捕获异常时使用try…catch进行捕获!!
百思不得小赵
2022/12/01
1.1K0
Scala 高阶(十):Scala中的异常处理
Scala中的Collection
Traversable 遍历 Iterable 迭代 Set无序集合 Sequence序列 Map映射
ZONGLYN
2019/08/08
1.2K0
在Swift中创建可缩放的图像视图
没有什么比完美的图片更能让你的应用程序熠熠生辉,但如果你想让你的应用程序用户真正参与并与图片互动呢?也许他们想放大、平移、掌握这些图像?
玖柒的小窝
2021/11/05
5.7K0
Scala中的集合类型
----------目录--------------------------------------------------------- 1.Scala简介和安装 2.Scala语法介绍 3.Scala的函数 4.Scala中的集合类型 ------------------------------------------------------------------------------------------------------------- Scala中的集合类型     Scala提供了一套
云飞扬
2018/05/11
4.2K0
Scala中的闭包
除此之外,Scala还支持引用其他地方定义的变量:(x: Int) => x + more,这个函数将more也作为入参,不过这个参数是哪里来的?从这个函数的角度来看,more是一个自由变量,因为函数字面量本身并没有给more赋予任何含义。相反,x是一个绑定变量,因为它在该函数的上下文里有明确的定义:它被定义为该函数的唯一参数。如果单独使用这个函数字面量,而没有在任何处于作用域内的地方定义more,编译器将报错:
大蟒传奇
2018/08/14
8740
Scala中的偏函数
艺术地说,Scala中的Partial Function就是一个“残缺”的函数,就像一个严重偏科的学生,只对某些科目感兴趣,而对没有兴趣的内容弃若蔽履。Partial Function做不到以“偏”概全,因而需要将多个偏函数组合,最终才能达到全面覆盖的目的。所以这个Partial Function确实是一个“部分”的函数。 对比Function和Partial Function,更学术味的解释如下: 对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收
张逸
2018/03/07
2.6K0

相似问题

我希望SQLplus count(*)返回零值

11

我正在尝试从post获取数组的值。

30

获取介于8和数字值之间的字符: Oracle

120

获取介于值和大于之间的数据

10

我需要在Python的对象中获取介于{{ }}之间的值

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档