【问题标题】:Why my functional component in reactjs mapping an empty array?为什么我在 reactjs 中的功能组件映射一个空数组?
【发布时间】:2022-01-11 19:36:50
【问题描述】:

我很抱歉大家打扰你..我是 reactjs 的新手,我真的不知道为什么每次我在我的功能组件中单击“X”按钮时都会在我的 map() 中添加新的空行,我的期望是当我单击“X”时按钮它只在我的控制台中记录我的东西。这里有没有人可以帮助解释正在发生的事情以及如何解决这个问题?下面我发布我的代码。请指教,非常感谢。

import './App.css';
import React, { useEffect, useState } from 'react';
import uniqid from 'uniqid';

function App() {
const [heldItems, setHeldItems] = useState({
    salesno: '',
    plu: '',
    price: 0,
    dateandtime: '',
});

const [salesItemsTemp, setSalesItemsTemp] = useState([]);

const handlerOnChange = (e) => {
    let heldItemsTemp = { ...heldItems };
    heldItemsTemp.salesno = uniqid();
    heldItemsTemp[e.target.name] = e.target.value;
    heldItemsTemp.dateandtime = new Date().toLocaleString();
    console.log(heldItemsTemp);
    setHeldItems(heldItemsTemp);
};

const handlerOnSubmit = (e) => {
    e.preventDefault();
    setSalesItemsTemp([...salesItemsTemp, { heldItems }]);
    setHeldItems({
        salesno: '',
        plu: '',
        price: 0,
        dateandtime: '',
    });
};

const handlerRemove = () => {
    console.log('its from handlerRemove !');
};

useEffect(
    () => console.log('helditems', heldItems),
    [heldItems],
);

return (
    <>
        <form onSubmit={handlerOnSubmit} autoComplete="off">
            <h1>POS</h1>
            <input
                type="text"
                placeholder="Input item name"
                name="plu"
                onChange={handlerOnChange}
                value={heldItems.plu}
            />
            PLU
            <input
                type="number"
                placeholder="Input item price"
                name="price"
                onChange={handlerOnChange}
                value={heldItems.price}
            />
            Price
            <button type="submit">add item</button>
            <div>
                <ul>
                    {salesItemsTemp.map((sales) => {
                        console.log('mapping sales', sales);
                        const { salesno, plu, price, dateandtime } =
                            sales.heldItems;
                        return (
                            <li key={salesno}>
                                <p>salesno : {salesno}</p>
                                <p>plu : {plu}</p>
                                <p>price : {price}</p>
                                <p>dateandtime : {dateandtime}</p>
                                <button onClick={handlerRemove}>X</button>
                            </li>
                        );
                    })}
                </ul>
            </div>
        </form>
    </>
);

}

导出默认应用;

【问题讨论】:

  • 快速问:即使将“按钮”更改为“跨度”也会发生这种情况吗?
  • “在地图中添加空行”是什么意思?
  • 嘿,在你的方法handlerRemove 你是console.log 的东西。那里没有逻辑
  • @JoelPeltonen 暗示的是,您的&lt;button&gt; 可能会重新加载您的页面(因为您忘记将其设置为type="button")。但即使没有,也不会发生太多事情,因为您的 handlerRemove 不会删除任何内容。
  • @CherryDT handlerOnSubmit 正在调用 prevetDefault,所以这不会导致页面刷新,但它仍会调用处理程序,所以你的权利他应该设置 type="button" 以停止它作为默认值按钮是提交(听起来很愚蠢)。

标签: javascript arrays reactjs object render


【解决方案1】:

当您在此处按下 X 按钮时,您正在提交表单:

&lt;form onSubmit={handlerOnSubmit} autoComplete="off"&gt;

在您的 handlerOnSubmit 函数中运行以下行,为您的项目添加一个空条目。

setSalesItemsTemp([...salesItemsTemp, { heldItems }]);

在您的 X 按钮上使用 type="button" 以防止表单提交。或者,将提交处理程序移动到提交按钮上的 onClick 事件,而不是表单上。

【讨论】:

  • type="button" 是更好的选择,否则您将失去默认的 enter 键选项。
  • 重新措辞我的回答更喜欢这种方法。谢谢@Keith。
  • omg....我错过了...它的工作就像魔术..非常感谢您的建议..我会更加努力..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2020-04-07
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
相关资源
最近更新 更多