我正在构建一个应用程序,在那里我有不同的座位供用户预订,逻辑是,当你点击一个座位时,模式会显示出来,然后你点击确认,然后你会被重定向到另一个屏幕,显示座位加一.我需要的是,当我点击一个座位时,它应该显示该座位的名称(例如,"您已经 Select 了1个座位"),而当我点击确认时,它应该只会在另一个屏幕上增加该座位的编号.我需要的帮助是弄清楚如何在模式上呈现特定的标题,以及如何激发不同的函数来增加每个项目的编号,这样我就可以避免在几个组件中重复代码.提前谢谢您.以下是我的代码:

image screen 1

image screen 2

Seat.jsx:

import React, { useEffect, useState } from "react";
import "./zones.css";
import { RxCross2 } from "react-icons/rx";
import {
  addSeat_1,
  add_2,
  addSeat_3,
  addSeat_4,
  addSeat_5,
} from "../../../features/trolleys/trolleySlice";
import { useDispatch } from "react-redux";
import { Link } from "react-router-dom";

const Seats = () => {
  const [show, setShow] = useState(false);
  const [title, setTitle] = useState({
    data: [
      {
        value: "Seat 1",
        id: 1,
      },
      {
        value: "Seat 2",
        id: 2,
      },
      {
        value: "Seat 3",
        id: 3,
      },
      {
        value: "Seat 4",
        id: 4,
      },

      {
        value: "Seat 5",
        id: 5,
      },
    ],
  });

  const toggleTitle = () => {
    setTitle(title.data.map((item) => item.value === item.id && item.value));
  };

  const dispatch = useDispatch();

  useEffect(() => {
    document.title = "Zones";
  });

  return (
    <div className="seat__container">
      <div onClick={() => setShow(true)} className="seat seat__fresh">
        <img src="/assets/freshGoods.png" alt="fresh" />
        <p className="seat__text">Seat 1</p>
      </div>
      <div onClick={() => setShow(true)} className="seat seat__fruits">
        <img src="/assets/fruit_veg.png" alt="dry/good" />
        <p className="seat__text">Seat 2</p>
      </div>
      <div onClick={() => setShow(true)} className="seat seat__deli">
        <img src="/assets/deli.png" alt="dry/good" />
        <p className="seat__text">Seat 3</p>
      </div>
      <div onClick={() => setShow(true)} className="seat seat__frozen">
        <img src="/assets/frozen.png" alt="dry/good" />
        <p className="seat__frozen">Seat 4</p>
      </div>
      <div onClick={() => setShow(true)} className="seat seat__WindSpritz">
        <img src="/assets/wine_spritz.png" alt="electronic" />
        <p className="seat__text">Seat 5</p>
      </div>
      <div className="seat seat__undraw">
        <img
          className="undraw"
          src="/assets/undraw_gone_shopping_re_2lau 1.png"
          alt="undraw"
        />
      </div>
      {show && (
        <div className="modal">
          <div className="inner__modal">
            <RxCross2 onClick={() => setShow(false)} />
            <p className="selected__text">You have selected</p>

        <p onClick={toggleTitle} className="item__name">
           {/*a specific name for a seat about should be displayed here*/}
          
        </p>

        {title.data.map((item) =>(
  

       <Link
     onClick={() => {
     item.value==="seat 1"&&dispatch(addSeat_1())
     item.value==="seat 1"&&dispatch(addSeat_2())
    item.value==="seat 1"&&dispatch(addSeat_3())
    item.value==="seat 1"&&dispatch(addSeat_4())
     item.value==="seat 1"&&dispatch(addSeat_5())
   }}
  to="/room"
   className="confirm__btn"
   >
   Confirm
   </Link>
    ))}
        <button onClick={() => setShow(false)} className="cancel__btn">
          Cancel
        </button>
      </div>
    </div>
  )}
</div>

  );
};

export default Seats;

Room.jsx:

import "./room.css";
import { GiCancel } from "react-icons/gi";
import { useEffect } from "react";
import { useSelector } from "react-redux";

const Room = () => {
  const roomQty = useSelector((state) => state.room);

  useEffect(() => {
    document.title = "Room";
  });

  return (
    <div className="room__container">
      <div className="room__list">
        <div className="room__item__box room__item__box__fresh">
          <div className="left__items">
            <div className="image__box">
              <img src="/assets/seat1s.png" alt="img" />
            </div>
            <p className="room__text">Seat1</p>
          </div>
          <div className="right__items">
            <span className="item__count">{roomQty.seat1Qty}</span>

            <div className="button__items">
              <GiCancel className="cancel" />
              <button className="cancel">Cancel</button>
            </div>
          </div>
        </div>
        <div className="room__item__box room__item__box__fruit-veg">
          <div className="left__items">
            <div className="image__box">
              <img src="/assets/seat2.png" alt="img" />
            </div>
            <p className="room__text">Seat2</p>
          </div>
          <div className="right__items">
            <span className="item__count">{roomQty.seat2Qty}</span>
            <div className="button__items">
              <GiCancel className="cancel" />
              <button className="cancel">Cancel</button>
            </div>
          </div>
        </div>
        <div className="room__item__box">
          <div className="left__items">
            <div className="image__box">
              <img src="/assets/seat3.png" alt="img" />
            </div>
            <p className="room__text">Seat3</p>
          </div>
          <div className="right__items">
            <span className="item__count">{roomQty.seat3Qty}</span>
            <div className="button__items">
              <GiCancel className="cancel" />
              <button className="cancel">Cancel</button>
            </div>
          </div>
        </div>
        <div className="room__item__box room__item__box__frozen">
          <div className="left__items">
            <div className="image__box">
              <img src="/assets/seat4.png" alt="img" />
            </div>
            <p className="room__text">Seat4</p>
          </div>
          <div className="right__items">
            <span className="item__count">{roomQty.seat4Qty}</span>

            <div className="button__items">
              <GiCancel className="cancel" />
              <button className="cancel">Cancel</button>
            </div>
          </div>
        </div>
        <div className="room__item__box room__item__box__wineSpritz">
          <div className="left__items">
            <div className="image__box">
              <img src="/assets/seat5.png" alt="img" />
            </div>
            <p className="room__text">Seat5</p>
          </div>
          <div className="right__items">
            <span className="item__count">{roomQty.seat5Qty}</span>
            <div className="button__items">
              <GiCancel className="cancel" />
              <button className="cancel">Cancel</button>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
};

export default Room;

推荐答案

Seats中没有任何东西将特定的"席位"元素与任何特定的标题公关动作相关联.我建议对组件进行一点重构,以获得映射到UI的Seat配置数组,并使用单个选定的seat状态为null(to indicate no seat is selected)或设置为特定的Seat对象值.

...
import {
  addSeat_1,
  addSeat_2,
  addSeat_3,
  addSeat_4,
  addSeat_5,
} from "../../../features/trolleys/trolleySlice";
...
const seats = [
  {
    action: addSeat_1,
    value: "Seat 1",
    id: 1,
    className: "seat__fresh",
    img: {
      src: "/assets/freshGoods.png",
      alt: "fresh",
    },
  },
  {
    action: addSeat_2,
    value: "Seat 2",
    id: 2,
    className: "seat__fruits",
    img: {
      src: "/assets/fruit_veg.png",
      alt: "dry/good",
    },
  },
  {
    action: addSeat_3,
    value: "Seat 3",
    id: 3,
    className: "seat__deli",
    img: {
      src: "/assets/deli.png",
      alt: "dry/good",
    },
  },
  {
    action: addSeat_4,
    value: "Seat 4",
    id: 4,
    className: "seat__frozen",
    img: {
      src: "/assets/frozen.png",
      alt: "dry/good",
    },
  },
  {
    action: addSeat_5,
    value: "Seat 5",
    id: 5,
    className: "seat__WindSpritz",
    img: {
      src: "/assets/wine_spritz.png",
      alt: "electronic",
    },
  },
];
const Seats = () => {
  const dispatch = useDispatch();

  const [selectedSeat, setSelectedSeat] = useState(null);

  useEffect(() => {
    document.title = "Zones";
  }, []);

  return (
    <div className="seat__container">
      {seats.map((seat) => {
        const { className, id, img, value } = seat;
        return (
          <div
            key={id}
            onClick={() => setSelectedSeat(seat)}
            className={["seat", className].filter(Boolean).join(" ")}
          >
            <img {...img} />
            <p className="seat__text">{label}</p>
          </div>
        );
      })}
      <div className="seat seat__undraw">
        <img
          className="undraw"
          src="/assets/undraw_gone_shopping_re_2lau 1.png"
          alt="undraw"
        />
      </div>
      {selectedSeat && (
        <div className="modal">
          <div className="inner__modal">
            <RxCross2 onClick={() => setSelectedSeat(null)} />
            <p className="selected__text">
              You have selected
            </p>

            <p className="item__name">
             {seat.label}
            </p>

            <Link
              onClick={() => dispatch(selectedSeat.action())}
              to="/room"
              className="confirm__btn"
            >
              Confirm
            </Link>
            <button
              onClick={() => setSelectedSeat(null)}
              className="cancel__btn"
            >
              Cancel
            </button>
          </div>
        </div>
      )}
    </div>
  );
};

Reactjs相关问答推荐

useReducer和带有回调的useState之间是否有实际区别?

如何通过TEK查询将对象传递到Express后台

react 下拉菜单任务

通过单击具有此值的按钮将值添加到数组对象键

有没有办法在Shopify中显示自定义计算的交货日期?

在React Create App TS项目中安装material UI

通过createRoot创建的React元素无法调用Provider值

在reduce()方法上得到NaN

Mui DataGrid 在第二页和前一页上显示项目时出现问题

画布:用鼠标绘制形状时重新绘制整个画布会导致卡顿

为什么在 React 的 useEffect 中使用 onAuthStateChanged ?

cypress `cy.now()` Type 'Promise' 没有调用签名

在 Nextjs13 应用程序目录中呈现从 supabase 获取的数据

如何防止开发人员使用 ESLint 在 React 项目中使用特定的钩子?

React Three Fiber mesh 标签在此浏览器中无法识别

导入样式化组件时未导入组件内容

如何从其他组件访问 useQuery refetch 方法?

如何定制 React 热 toastr ?

用 scss 覆盖 MUI

找不到元素 - 这是参考问题吗?