未捕获的 TypeError:调度不是函数

Uncaught TypeError: dispatch is not a function

提问人:Jayesh Patil 提问时间:9/23/2022 最后编辑:Jayesh Patil 更新时间:4/11/2023 访问量:801

问:

尝试在窗口上执行调度操作时,我遇到此错误:。我正在研究 react 上下文 API 而不是 redux。"Uncaught TypeError: dispatch is not a function at removeFromCart (CheckoutProduct.js:11:1)"

这是我的CheckoutProduct.js代码

import "./CheckoutProduct.css";
import { useStateValue } from "./StateProvider";

function CheckoutProduct({ id, title, image, price, rating }) {
  const [dispatch] = useStateValue();

  console.log(id, title, image, price, rating);

  const removeFromCart = () => {
    dispatch({
      type: "REMOVE_FROM_CART",
      id: id,
    });
  };

  return (
    <div className="checkoutProduct">
      <img className="checkoutProduct__image" src={image} alt="" />

      <div className="checkoutProduct__info">
        <p className="checkoutProduct__title">{title}</p>

        <p className="checkoutProduct__price">
          <small>₹</small>
          <strong>{price}</strong>
        </p>

        <div className="checkoutProduct__rating">
          {Array(rating)
            .fill()
            .map((_, i) => (
              <p>⭐</p>
            ))}
        </div>

        <button onClick={removeFromCart}>Remove from Cart</button>
      </div>
    </div>
  );
}

export default CheckoutProduct;

这是我的reducer.js代码

  cart: [
    {
      id: "12345",
      title: "Versace T-Shirt",
      price: 4999,
      image:
        "https://www.versace.com/dw/image/v2/ABAO_PRD/on/demandware.static/-/Sites-ver-master-catalog/default/dw5f8ee257/original/90_E73GAHT11-ECJ00T_E899_16_PieceNumberLogoT-Shirt-T-shirtsandPolos-versace-online-store_0_2.jpg?sw=450&sh=632&sm=fit&sfrm=jpg&cksizes=380w",
      rating: 3,
    },
    {
      id: "12345",
      title: "Versace T-Shirt",
      price: 4999,
      image:
        "https://www.versace.com/dw/image/v2/ABAO_PRD/on/demandware.static/-/Sites-ver-master-catalog/default/dw5f8ee257/original/90_E73GAHT11-ECJ00T_E899_16_PieceNumberLogoT-Shirt-T-shirtsandPolos-versace-online-store_0_2.jpg?sw=450&sh=632&sm=fit&sfrm=jpg&cksizes=380w",
      rating: 3,
    },
  ],
  user: null,
};

const reducer = (state, action) => {
  console.log(action);
  switch (action.type) {
    case "ADD_TO_CART":
      return {
        ...state,
        cart: [...state.cart, action.item],
      };
    case "REMOVE_FROM_CART":
      let newCart = [...state.cart];

      const index = state.cart.findIndex(
        (cartItem) => cartItem.id === action.id
      );

      if (index >= 0) {
        //remove
        newCart.splice(index, 1);
      } else {
        console.warn(
          `Can't remove product (id: ${action.id} as its not in cart)`
        );
      }
      return {
        ...state,
        cart: newCart,
      };
    default:
      return state;
  }
};

export default reducer;

这是我的 ./StateProvider.js 图像对不起图像代码,系统不允许我添加代码 ./StateProvider.js 忽略这部分,这是为了系统不允许我发布代码 nafoiajijaijfajnvnaijijakjlskcadlkcjdnvdnvvanlkcnchchhchchcjjdndjkancjndolnhclhndvjsdcecfohfkflkjkljflkjfoiajflandfnduhdvjnvndvdojdnfanfofnavnoavanvnrjsflsjfslfjsfjovonkvkjsvlkjavlkjaldkvjlksvldkvdnv

JavaScript ReactJS TypeError UncaughtExceptionHandler

评论

3赞 Konrad 9/23/2022
显示./StateProvider
2赞 Nir Alfasi 9/23/2022
在没有看到实现的情况下,我们可以说出它返回的内容以及它是否是一个函数......useStateValue
0赞 Community 9/23/2022
请修剪您的代码,以便更轻松地找到您的问题。请遵循以下准则,创建一个最小的可重现示例
0赞 Jayesh Patil 9/23/2022
@KonradLinkowski./StateProvider 已上传,请帮我
1赞 Nir Alfasi 9/23/2022
你这样声明调度:后来你把它作为一个函数来使用。为了了解为什么它不是一个函数,我们需要查看该方法的实现: .希望这能更清楚。const [dispatch] = useStateValue();useStateValue

答:

1赞 Konrad 9/23/2022 #1

useReducer返回带有两个参数的数组

  1. 调度函数

你被命名为你的变量 - 你尝试运行它statedispatch

您想这样做:

const [,dispatch] = useStateValue();

评论

1赞 Konrad 9/23/2022
@RobinZigmond op 发布了一个指向 i.stack.imgur.com/BBvoa.png 实施的链接 再读一遍问题useStateValue
0赞 Robin Zigmond 9/23/2022
对不起,我完全错过了链接。我已经撤回了反对票和评论!
1赞 Konrad 9/23/2022
没问题,我一开始也没有看到它,因为它应该是文本,而不是指向图像的链接
-2赞 Jayesh Patil 9/23/2022 #2

因为这是 React Context API 而不是 redux。这可能不适合您。 但是下面的代码对我有用。 在CheckoutProduct.js

  const [{ cart }, dispatch] = useStateValue();

  console.log(cart);

  const removeFromCart = () => {
    dispatch({
      type: "REMOVE_FROM_CART",
      id: id,
    });
  };
  ...

评论

0赞 Rando Hinn 9/27/2022
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
-1赞 Tochukwu Patrick 4/6/2023 #3
const [dispatch] = useDispatch();
dispatch(setMovie({ }));

评论

3赞 Community 4/11/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。