Как правильно перезаписать state для массива обьектов?
Иницилизация обьектов
ype Result = number
interface Answer {
result: Result[]
}
const answers: Answer[] = [];
questions.forEach(()=>{ // сразу же инициализируем массив объектов. Каждый объект имеет лишь одно свойство - массив выбранхы пользователем ответов. Если он пуст -> пользователь
answers.push({ // еще не ответил на этот вопрос. [...answers, result:[]]
result:[]
});
})
Массив answers выглядит так
[{result:[]},{result:[]},{result:[]},{result:[]}]
Создание хука
const [currentAnswer, setNewAnswer] = useState<Answer[]>(answers);
То что я пробовал:
1)
currentAnswer[currentQuestion].result.push(Number(e.target.id));
setNewAnswer(currentAnswer);
let newValue = currentAnswer[currentQuestion].result;
newValue.push(Number(e.target.id));
console.log(newValue)
setNewAnswer({...currentAnswer[currentQuestion], newValue}) //ругается на тип newValue
//Argument of type '{ newValue: number[]; result: number[]; }' is not assignable to parameter of type 'SetStateAction<Answer[]>'.
Object literal may only specify known properties, and 'newValue' does not exist in type 'SetStateAction<Answer[]>'
Стейт перезаписывается, но при этом перерисовка не происходит, думаю, дело в том, что обьекты работают иначе. Подскажите как правильно реализовать эту часть
Ответы (1 шт):
Во первых прочтите внимательнее данную статью: https://reactjs.org/docs/state-and-lifecycle.html Без неё вам будет тяжко. !!! Нельзя менять стейт напрямую. Вы должны менять новое значение и полностью перезаписывать старое Во вторых: У вас переменная называется currentAnswer (нынешний ответ), а вы даёте туда массив ответов. Если вы хотите хранить именно один ответ, то делайте так
(value) => setNewAnswer(value);
Как я понял вам нужно просто хранить выбранный ответ, т.е т.к выше. Если это обычный ReactJS,то вы можете сделать это через селект
answers.map((item, i) => {
// тут уже сами можете использовать это как для проверки на активность
let selected = (i === item.id ? true : false;
return (
<option key={i} value={item.id} onClick={() => setAnswer(item.id)}>{item.name}</option>
)