Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何动态更改处于React状态的对象的a值_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 如何动态更改处于React状态的对象的a值

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之间)添加了任何新对象,或者在

这里我在React hook中有一个状态,它有一个多对象数组。每个对象都有一个名为value的键,该键存储排序值(+前一个对象的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
      ];
    });
  };