#javascript #object #react-hooks #spread
#javascript #объект #реагирующие перехватчики #распространение
Вопрос:
Как я могу обновить объект состояния react hooks, который имеет вложенный объект, содержащий объекты с индексными ключами?
Вот объект состояния по умолчанию.
const [form, setForm] = useState({
name:'',
price:'',
effects:{
0:{},
1:{},
}
})
Моя цель — обновить первый ключ в объекте эффектов.
Я пробовал некоторый подобный код.
const variable = "Sleepy"
const variableObject = {[variable]:0}
setForm({...form, ...{...form.effects, ...{0:{ variableObject }} } })
Эта попытка помещает объект за пределы вложенного объекта эффектов следующим образом.
{
0:{"Sleepy":0},
1:{},
name:'',
price:'',
effects:{
0:{},
1:{},
}
}
Вместо этого конечное состояние объекта должно выглядеть следующим образом.
{
name:'',
price:'',
effects:{
0:{"Sleepy":0},
1:{},
}
}
Ответ №1:
Как насчет:
form.effects[0].Sleepy = 0;
setForm({...form});
Комментарии:
1. Окончательное использование с вашим ответом…
onSelect={(_, x) => ((form.effects[0][x.value] = 0),(setForm({...form})))}
Ответ №2:
Решение, которое вы ищете, выглядит примерно так,
...form,
effects:{
...form.effects,
0: {...variableObject}
}
})
оператор spread инвертирует упаковку объекта, чтобы открыть его наизнанку.
Таким образом, открыв слой, мы могли напрямую обращаться к парам ключ-значение.
.
Кроме того, есть еще один подход, который может помочь вам в долгосрочной перспективе.
setForm((oldForm)=>{
return oldForm.effects.0 = variableObject
})
Обратите внимание, что вы также можете использовать сокращенную нотацию, чтобы уменьшить объем кода, который вы можете написать. Здесь я включил предложение return, чтобы прояснить работу setState с обратным вызовом.
В любом случае, вот сокращенное обозначение.
setForm((oldForm)=> oldForm.effects.0 = variableObject)
.
Хорошего дня