获取所选项目及其计数

如何解决获取所选项目及其计数

我正在尝试制作一个类似于 this site 的购物车应用,但使用的是 reactjs

index.js:(将每个产品发送到产品 component

        {products.length > 0
          ? products.map((product) => (
              <Product key={product.id} product={product} />
            ))
          : ""}

components/product.js

<div>
    {product?.price}
   <h3>
      {product.name ? product.name : ""}
   </h3>
   <div dangerouslySetInnerHTML={{ __html: product?.description }} />
</div>

我还有添加按钮 UI 开关代码,看起来像,

在点击添加按钮之前,

------------
| ADD     +|
------------

点击添加按钮后,

-----------------
| -  {count}   +|
-----------------

目前一切正常,每个产品的相应数量会单独添加到主页中。

也在 contextApi 的帮助下制作了一个 AppContext 并更新了购物车,

  const addToCart = (product) => {
    if (+cart >= 0) {
      setCart(+cart + 1);
      setCartItems(product);
    }
  };

nav.js 中,我获得了产品的更新数量,但是当我点击购物袋菜单(这是一个购物车页面)时,我无法获取上下文。

预期结果

在访问购物车页面时(点击标题中的购物袋菜单),页面将分别显示目前选择的产品(包括名称和描述)及其数量。

当前结果:

无法获取 appcontext 数据并显示所选产品和数量。

工作片段:

Edit Using Tailwind with Next.js (forked)

请帮助我在导航到购物车(袋)页面时实现显示所选产品及其各自数量的结果。 .. 提前致谢..

解决方法

问题

  1. 您有多个 AppProvider 组件,每个组件都为其包装的子级提供不同的上下文。
  2. 初始 AppContext 形状与实际作为上下文值传递的内容不匹配。
  3. cartItems 状态不作为数组维护。
  4. 其他各种问题和模式

解决方案

  1. 删除所有无关的 AppProvider 提供程序组件,仅使用一个将整个应用程序包装在 _app.js 中。

    import { AppProvider } from "../components/context/AppContext";
    
    export default class TailwindApp extends App {
      render() {
        const { Component,pageProps } = this.props;
        return (
          <AppProvider>
            <Component {...pageProps} />
          </AppProvider>
        );
      }
    }
    
  2. 修复上下文以获得与提供的值匹配的初始值。修复状态更新器以正确管理 cartItems 数组。当 useEffect 数组状态更新时,使用 cartItems 钩子计算派生的总项目计数状态。正确添加和更新商品/产品数量,并在数量达到 0 时移除商品。

    import React,{ useState,useEffect } from "react";
    
    export const AppContext = React.createContext({
      cart: 0,cartItems: [],setCart: () => {},addToCart: () => {},removeFromCart: () => {}
    });
    
    export const AppProvider = (props) => {
      const [cart,setCart] = useState(0);
    
      const [cartItems,setCartItems] = useState([]);
    
      useEffect(() => {
        setCart(cartItems.reduce((count,{ quantity }) => count + quantity,0));
      },[cartItems]);
    
      const addToCart = (product) => {
        setCartItems((items) => {
          if (items.find(({ id }) => id === product.id)) {
            return items.map((item) =>
              item.id === product.id
                ? {
                    ...item,quantity: item.quantity + 1
                  }
                : item
            );
          } else {
            return [
              ...items,{
                ...product,quantity: 1
              }
            ];
          }
        });
      };
    
      const removeFromCart = (product) => {
        setCartItems((items) => {
          const foundItem = items.find(({ id }) => id === product.id);
          if (foundItem?.quantity > 1) {
            return items.map((item) =>
              item.id === product.id
                ? {
                    ...item,quantity: item.quantity - 1
                  }
                : item
            );
          } else {
            return items.filter(({ id }) => id !== product.id);
          }
        });
      };
    
      return (
        <AppContext.Provider value={{ cart,addToCart,removeFromCart,cartItems }}>
          {props.children}
        </AppContext.Provider>
      );
    };
    
  3. Products.js 中删除所有本地项目计数状态,可以从上下文中的状态访问数量。在项目计数上有条件地呈现“添加项目”和递增/递减按钮。

    import Link from "next/link";
    import { useContext } from "react";
    import { AppContext } from "./context/AppContext";
    
    const Product = (props) => {
      const { product } = props;
      const contextData = useContext(AppContext);
    
      const count =
        contextData.cartItems.find(({ id }) => id === product.id)?.quantity ?? 0;
    
      const addToCart = (product) => () => {
        contextData.addToCart(product);
      };
      const removeFromCart = (product) => () => {
        contextData.removeFromCart(product);
      };
    
      return (
        ...
    
            {count ? (
              ...
                  {count}
              ...
            ) : (
              ...
                  <span className="label">ADD</span>
              ...
            )}
          </div>
        </div>
      );
    };
    
  4. Cart.js 中,您可以导入和使用上下文来呈现和显示购物车项目。

    import { useContext } from "react";
    import { AppContext } from "../components/context/AppContext";
    
    const Cart = () => {
      const { cart,cartItems } = useContext(AppContext);
    
      return (
        <div>
          <h1> Cart Page </h1>
          <h2>Total Item Count: {cart}</h2>
          <p>
            <ul>
              {cartItems.map(({ id,name,quantity }) => (
                <li key={id}>
                  {name}: {quantity}
                </li>
              ))}
            </ul>
          </p>
        </div>
      );
    };
    

注意:请注意,id 属性已添加到您的 products 数组中的所有项目/产品中,以使匹配/识别它们变得更加容易.

演示

Edit Using Tailwind with Next.js (forked)

,

您需要将 AppProvider 移至 _app.js 并将其从 index.jscart.js 中删除,然后两个页面才能访问相同的上下文。

您的 _app.js 应如下所示


import React from "react";
import App from "next/app";
import { AppProvider } from "../components/context/AppContext";

export default class TailwindApp extends App {
  render() {
    const { Component,pageProps } = this.props;
    return (
      <AppProvider>
        <Component {...pageProps} />
      </AppProvider>
    );
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-