[英]How to map using useState React
我有一个输入字段,我想在其中输入一个数字; 然后,此数字应存储在 state 中的指定键“mktratedelta”中。
我正在使用映射来做到这一点。 出于某种原因,我无法在输入字段中输入。 这是正确的方法吗?如何解决这个问题?
const [marketEstimateDataBCAssets, setmarketEstimateData] = useState([
{
name: "Lombard",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.03,
mktrateestimate: 0.04
},
{
name: "Other Secured",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.033,
mktrateestimate: 0.04
},
{
name: "Unsecured",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.0333,
mktrateestimate: 0.04
}
]);
{Object.keys(marketEstimateDataBCAssets).map(function(key) {
return (
<Segment>
<div> {marketEstimateDataBCAssets[key].name}</div>
<div> {marketEstimateDataBCAssets[key].prevgroupinputrate}</div>
<div> {marketEstimateDataBCAssets[key].currgroupinputrate}</div>
<input
value={marketEstimateDataBCAssets[key].mktratedelta}
onChange={e =>
(marketEstimateDataBCAssets[key].mktratedelta = e.target.value)
}
/>
<div> {marketEstimateDataBCAssets[key].mktrateestimate}</div>
</Segment>
);
这是一个如何将逻辑拆分为两个组件并呈现资产列表的示例
function myAwesomeComponent() {
const [marketData, setMarketData] = useState([
{
id: 0,
name: 'Lombard',
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.03,
mktrateestimate: 0.04,
},
{
id: 1,
name: 'Other Secured',
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.033,
mktrateestimate: 0.04,
},
{
id: 2,
name: 'Unsecured',
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.0333,
mktrateestimate: 0.04,
},
]);
const onChange = (asset) => (event) => {
setMarketData((oldMarketData) => {
const index = oldMarketData.indexOf(asset);
const oldAsset = oldMarketData[index];
const newMarketData = [...oldMarketData];
newMarketData[index] = {
...oldAsset,
mktratedelta: event.target.value,
};
return newMarketData;
});
};
return (
<>
{marketData.map((asset) => (
<Asset asset={asset} onChange={onChange} />
))}
</>
);
}
const Asset = ({ asset, onChange }) => (
<Segment key={asset.id}>
<div> {asset.name}</div>
<div> {asset.prevgroupinputrate}</div>
<div> {asset.currgroupinputrate}</div>
<input value={asset.mktratedelta} onChange={onChange(asset)} />
<div> {asset.mktrateestimate}</div>
</Segment>
);
如果您对 marketData 数组中的属性名称有影响,那么您应该考虑使用 camelCase,所以
{
id: 0,
name: 'Lombard',
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.03,
mktrateestimate: 0.04,
}
变成
{
id: 0,
name: 'Lombard',
prevGroupInputrate: 0.01,
currGroupInputrate: 0.02,
mktRateDelta: 0.03,
mktRateEstimate: 0.04,
}
您正在直接更改state
。 不要这样做。 尝试这样的事情:
return (
<>
{marketEstimateDataBCAssets.map((item, key) => (
<div>
<div> {item.name}</div>
<div> {item.prevgroupinputrate}</div>
<div> {item.currgroupinputrate}</div>
<input
value={item.mktratedelta}
onChange={e => {
const newArr = marketEstimateDataBCAssets.map(el => {
if (el.name === item.name) {
return { ...el, mktratedelta: parseFloat(e.target.value) };
}
return el;
});
console.log(newArr);
return setmarketEstimateData([...newArr]);
}}
/>
<div> {item.mktrateestimate}</div>}
</div>
))}
</>
);
这是一个快速演示。 感谢@Titus 指出问题。
代码存在一些问题。 1. 你不能在Object.keys
上做 Object.keys ( marketEstimateDataBCAssets
是你代码中的一个数组);
您可以通过简单地删除Object.keys
来解决第一个问题;
对于第二个问题,只需创建一个 function 将数组键值与输入值一起传递。 在 function 中创建一个数组并更新索引 object 的值,然后只需将新数组数据传递给setmarketEstimateData
所以代码将是:
const [marketEstimateDataBCAssets, setmarketEstimateData] = useState([
{
name: "Lombard",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.03,
mktrateestimate: 0.04
},
{
name: "Other Secured",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.033,
mktrateestimate: 0.04
},
{
name: "Unsecured",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.0333,
mktrateestimate: 0.04
}
]);
function updateValue(e, key) {
let data = setmarketEstimateData;
data[key].mktratedelta = e.target.value;
marketEstimateDataBCAssets.map(data);
}
{marketEstimateDataBCAssets.map(function(item,key) {
return (
<Segment>
<div> {item.name}</div>
<div> {item.prevgroupinputrate}</div>
<div> {item.currgroupinputrate}</div>
<input
value={item.mktratedelta}
onChange={e => updateValue(e, updateValue(e, key))}
/>
<div> {item.mktrateestimate}</div>
</Segment>
);
}
像这样的东西。
import React from 'react';
const Component = () => {
const [marketEstimateDataBCAssets, setmarketEstimateData] = useState([
{
name: "Lombard",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.03,
mktrateestimate: 0.04
},
{
name: "Other Secured",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.033,
mktrateestimate: 0.04
},
{
name: "Unsecured",
prevgroupinputrate: 0.01,
currgroupinputrate: 0.02,
mktratedelta: 0.0333,
mktrateestimate: 0.04
}
]);
const preSetEstimateData = (value, itemId) => {
const item = marketEstimateDataBCAssets[itemId];
const newItem = {
...item,
mktrateestimate: value,
}
setmarketEstimateData([
...marketEstimateDataBCAssets.slice(0, itemId),
newItem,
...marketEstimateDataBCAssets.slice(itemId)
]);
};
return (
<div>
{
marketEstimateDataBCAssets.map((item, id) => {
return (
<Segment>
<div> {item.name}</div>
<div> {item.prevgroupinputrate}</div>
<div> {item.currgroupinputrate}</div>
<input
value={item.mktratedelta}
onChange={e => preSetEstimateData(e.target.value, id)}
/>
<div> {item.mktrateestimate}</div>
</Segment>
)
})
}
</div>
)
}
export default Component;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.