Обнаружить и поправить ошибки в React‑компоненте

Восстановите JSX, сделайте input контролируемым и добавляйте элементы без изменения data.length. Для новых id используйте отдельный счётчик, а в списке — стабильный key.

Короткий ответ

Что ответить на собеседовании

Восстановите 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, поэтому пустой ввод проверяется отдельно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее