Javascript 如何动态更改处于React状态的对象的a值
这里我在React hook中有一个状态,它有一个多对象数组。每个对象都有一个名为value的键,该键存储排序值(+前一个对象的1):Javascript 如何动态更改处于React状态的对象的a值,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,这里我在React hook中有一个状态,它有一个多对象数组。每个对象都有一个名为value的键,该键存储排序值(+前一个对象的1): const[state,setState]=useState([ { value=“item1”, data=“…” }, { value=“item2”, data=“…” }, { value=“item3”, data=“…” }, {............ ]) 现在我的问题是,如果在任何以前的对象之间(例如:索引0和1之间)添加了任何新对象,或者在
const[state,setState]=useState([
{
value=“item1”,
data=“…”
},
{
value=“item2”,
data=“…”
},
{
value=“item3”,
data=“…”
},
{............
])
现在我的问题是,如果在任何以前的对象之间(例如:索引0和1之间)添加了任何新对象,或者在末尾添加了任何新对象,或者将其中一个对象向上/向下移动,那么如何动态设置value
键的值
在解决方案之前,我尝试比较索引值,并尝试使用onChange
方法进行设置,但遇到以下情况:
//qtNumber处理编号,问题是将它们设置为状态
常量集合编号=(索引,qtNumber)=>{
设置状态(问题=>{
返回[
…prevQuestion.slice(0,CurrentSection),
{
…前面的问题[当前部分],
值:“项目”+数量
},
…prevQuestion.slice(当前节+1)
];
});
};
为了回答您的问题,您可以将新元素之后的所有元素映射到具有更新的
值字段的新对象。我要说的是,这确实有点奇怪(可能表明您想在这里做一些不同的事情,这有点浪费)。但是,这应该满足您的要求:
//qtNumber Handles the numbering, problem is setting them in state
const SetNumbering = (index, qtNumber) => {
setState(prevQuestion => {
const before = prevQuestion.slice(0, CurrentSection)
const after = prevQuestion.slice(CurrentSection + 1).map((q, i) => ({
value: `item${i+qtNumber+1}`,
data: q.data
}))
return [
...before
{
...prevQuestion[CurrentSection],
value: "item" + qtNumber
},
...after
];
});
};
不清楚您要求的是什么,您是要生成唯一ID还是要基于动态密钥更新对象?很难确切地说出您要求的是什么,您描述的错误可能是由状态更新触发更多状态更新引起的,这似乎与您要问的问题无关。这可能是be要查看更多代码,您的解决方案尝试是什么样子的?您可以在添加新值后对数组进行排序,类似于setState([…state,newValue]。sort((a,b)=>parseInt(a.value.replace(/\D/g'))-parseInt(b.value.replace(/\D/g'))
更新了状态逻辑@emilebergron,希望以(item&index+1)我不想对@titusb进行排序,但对象中的键可能不同,因此在这种情况下?就像在一个对象中,可能有另一个键称为options
。我不完全确定您在这里的意思。您上面显示的模型中没有“options”。如果您引用的是数据
字符串,则会传递这些数据。如果您的对象具有不同的键,请使用类似于{…q,value:`items${i+qtNumber+1}}}
的方法更新多个数组中所有对象的编号吗?
//qtNumber Handles the numbering, problem is setting them in state
const SetNumbering = (index, qtNumber) => {
setState(prevQuestion => {
const before = prevQuestion.slice(0, CurrentSection)
const after = prevQuestion.slice(CurrentSection + 1).map((q, i) => ({
value: `item${i+qtNumber+1}`,
data: q.data
}))
return [
...before
{
...prevQuestion[CurrentSection],
value: "item" + qtNumber
},
...after
];
});
};