Sobes.tech
Back to questions
Middle+
2

Проведите код-ревью React-компонента, который выполняет переключение данных, вызывает строковую функцию и выводит список. Найдите и исправьте все ошибки и проблемы (async в useEffect, отсутствие массива зависимостей, использование индекса в качестве key и др.).

Companies where asked
КасперскийКасперский

Answer from AI

sobes.tech AI

Основные проблемы в React-компоненте с переключением данных, вызовом строковой функции и выводом списка:

  1. async в useEffect: нельзя делать саму функцию useEffect async, нужно объявить async функцию внутри и вызвать её.
  2. Отсутствие массива зависимостей: useEffect без массива зависимостей вызывается после каждого рендера, что может привести к бесконечным циклам.
  3. Использование индекса в качестве key: плохо для списков, где порядок или содержимое может меняться — лучше использовать уникальный идентификатор.

Пример исправленного кода:

import React, { useState, useEffect } from 'react';

function MyComponent({ data, stringFunctionName }) {
  const [items, setItems] = useState([]);

  useEffect(() => {
    async function fetchData() {
      // Предположим, data — это функция или промис
      const result = await data();
      setItems(result);
    }
    fetchData();
  }, [data]); // массив зависимостей с data

  // Предположим, что stringFunctionName — имя функции из объекта функций
  const functionsMap = {
    toUpperCase: str => str.toUpperCase(),
    toLowerCase: str => str.toLowerCase(),
    // другие функции
  };

  const transform = functionsMap[stringFunctionName] || (str => str);

  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>{transform(item.name)}</li> // используем уникальный id
      ))}
    </ul>
  );
}

export default MyComponent;

Таким образом:

  • useEffect содержит внутреннюю async функцию.
  • Добавлен массив зависимостей.
  • Для key используется уникальный идентификатор, а не индекс.
  • Вызов строковой функции реализован через маппинг имени в функцию.