reactjs - 如何更改输入之间的状态?
问题描述
我正在尝试制作一个计算税收和折扣的应用程序,但我无法弄清楚如何在各州之间建立沟通。由于输入之间的变化将是连续的,因此我为每个收件箱提供了 onkeyup 事件。每次调用此事件时,被调用的函数都必须执行必要的操作。例如,当我输入quantity 和unitPrice 值时,它会将这两个值相乘并将它们分配给goodsServiceAmt 值。该应用程序还具有添加和删除行的能力。每一行的计算应该是自己的。我试图用 handleQuantity 函数来做,状态正在更新,但输入中的值没有改变。
const App = () => {
const [mainData, setMainData] = useState([
{
id: 1,
quantity: "",
unitPrice: "",
discRate: "",
discAmt: "",
kdvAmt: "",
kdvRate: "",
goodsServiceAmt: "",
},
]);
const deleteRow = (e, i) => {
e.preventDefault();
const newArr = [...mainData];
console.log(i);
newArr.splice(i, 1);
setMainData(newArr);
};
const handleChangeInput = (e, i) => {
const values = [...mainData];
values[i][e.target.name] = e.target.value;
setMainData(values);
};
const addRow = () => {
const id = mainData.length ? mainData.length + 1 : 0;
console.log(id);
setMainData([
...mainData,
{
id,
quantity: "",
unitPrice: "",
discRate: "",
discAmt: "",
kdvAmt: "",
kdvRate: "",
goodsServiceAmt: "",
},
]);
};
const handleQuantity = (e, i) => {
const deger = [...mainData];
deger[i].unitPrice = e.target.value;
setMainData(deger);
};
return (
<div style={{ display: "flex", flexDirection: "column" }}>
{mainData.map((v, i) => (
<form key={i} style={{ display: "flex" }}>
<span style={{ width: "50px", height: "50px" }}>{v.id}</span>
<div className="input-cont">
<label htmlFor="quantity">quantity</label>
<input
type="text"
name="quantity"
value={mainData.quantity}
onChange={(e) => handleChangeInput(e, i)}
onKeyUp={(e) => handleQuantity(e, i)}
/>
</div>
<div className="input-cont">
<label htmlFor="unitPrice">unitPrice</label>
<input
type="text"
name="unitPrice"
value={mainData.unitPrice}
onChange={(e) => handleChangeInput(e, i)}
/>
</div>
<div className="input-cont">
<label htmlFor="discRate">discRate</label>
<input
type="text"
name="discRate"
value={mainData.discRate}
onChange={(e) => handleChangeInput(e, i)}
/>
</div>
<div className="input-cont">
<label htmlFor="discAmt">discAmt</label>
<input
type="text"
name="discAmt"
value={mainData.discAmt}
onChange={(e) => handleChangeInput(e, i)}
/>
</div>
<div className="input-cont">
<label htmlFor="kdvRate">kdvRate</label>
<input
type="text"
name="kdvRate"
value={mainData.kdvRate}
onChange={(e) => handleChangeInput(e, i)}
/>
</div>
<div className="input-cont">
<label htmlFor="kdvAmt">kdvAmt</label>
<input
type="text"
name="kdvAmt"
value={mainData.kdvAmt}
onChange={(e) => handleChangeInput(e, i)}
/>
</div>
<div className="input-cont">
<label htmlFor="goodsServiceAmt">goodsServiceAmt</label>
<input
type="text"
name="goodsServiceAmt"
value={mainData.goodsServiceAmt}
onChange={(e) => handleChangeInput(e, i)}
/>
</div>
<button onClick={(e) => deleteRow(e, i)}>delete</button>
</form>
))}
<button onClick={addRow}>add row</button>
<button onClick={() => console.log(mainData)}>clg</button>
</div>
);
};
export default App;
解决方案
发生这种情况是因为您像对象一样访问输入中的数据,但在您的 useState 中它是一个数组。
将您的使用状态更改为:
const [mainData, setMainData] = useState({
id: 1,
quantity: "",
unitPrice: "",
discRate: "",
discAmt: "",
kdvAmt: "",
kdvRate: "",
goodsServiceAmt: "",
});
或将输入中的值更改为:
value={mainData[0].quantity}
推荐阅读
- module - SICStus Prolog 中的隐式模块初始化
- excel - 如果单元格具有特定值,则删除行
- python-3.x - 如何从支票图像中提取支票金额?
- php - Laravel Eloquent:产品、属性和属性值的关系
- python - 在 venv 中使用 pip for linux 安装 openbabel
- javascript - React Native with Expo - 键盘压缩元素
- deno - 如何在一处管理 Deno 依赖项
- android - 如果“值”在kotlin中有“null”或“0”,如何过滤列表
- html - 在文本左侧添加图像
- python - Python二分法