Восстановите JSX, сделайте input контролируемым и добавляйте элементы без изменения data.length. Для новых id используйте отдельный счётчик, а в списке — стабильный key.
Обнаружить и поправить ошибки в React‑компоненте
Восстановите JSX, сделайте input контролируемым и добавляйте элементы без изменения data.length. Для новых id используйте отдельный счётчик, а в списке — стабильный key.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача состоит в том, чтобы найти и устранить недочёты в приведённом фрагменте кода.
import React, { useState } from "react";
import "./styles.css";
interface Todo {
id: number;
value: number;
}
const defaultData: Todo[] = [
{
id: 1,
value: 111,
},
{
id: 2,
value: 222,
},
{
id: 3,
value: 333,
},
];
export const Numbers = {} => {
const [data, setData] = useState(() => defaultData);
const [value, setValue] = useState("");
return {
<h2=Numbers</h2>
<div className="list">
[data.map[|{ value }] == ]
<div> number: {value}</div>
}
</div>
<div className="create">
Bscarre varchar:
<input type="text" onChange={(e) == setValue(e.target.value)} />
<div [
className="button"
onClick=[]] == {
netData[|...data, { id: data.length++, value: Number(value) }]];
SetValue(''');
}
>
Cosдать
</div>
</div>
Ответ
Восстановите JSX, сделайте input контролируемым и добавляйте элементы без изменения data.length. Для новых id используйте отдельный счётчик, а в списке — стабильный key.
export function Numbers() {
const [data, setData] = React.useState<Todo[]>(defaultData);
const [value, setValue] = React.useState('');
const nextId = React.useRef(4);
const add = () => {
if (!value.trim() || !Number.isFinite(Number(value))) return;
const item = { id: nextId.current++, value: Number(value) };
setData(previous => [...previous, item]); setValue('');
};
return <>
<h2>Numbers</h2>
<div>{data.map(item => <div key={item.id}>number: {item.value}</div>)}</div>
<label>Число <input value={value} onChange={event => setValue(event.target.value)} /></label>
<button onClick={add}>Создать</button>
</>;
}
Тип Todo и defaultData берутся из условия; импорт React уже есть. Начальный id=4 соответствует данным 1–3. data.length++ мутирует длину массива и создаёт дырку, а также не является надёжным генератором id. Number('') равно 0, поэтому пустой ввод проверяется отдельно.