Гид по технологиям

Создание компонента таблицы React из JSON

5 min read Frontend Обновлено 06 Jan 2026
Компонент таблицы React из JSON
Компонент таблицы React из JSON

Таблица с числовыми данными

Одним из простых способов вынести данные из HTML — хранить их в формате JSON. JSON популярен и удобен, особенно при работе с JavaScript.

В React логично отдавать JSON-данные в компонент, который генерирует таблицу. Такой компонент масштабируется вместе с данными: количество строк не фиксировано, оно зависит от содержимого JSON.

Что понадобится

  • Установленный Node.js и npm/yarn.
  • Базовое понимание React (функциональные компоненты, props).
  • Проект React (например, созданный через create-react-app).

Создание JSON-данных

В этой инструкции таблица берет данные из локального файла JSON. В реальном приложении данные могут подгружаться с API.

В папке src создайте файл data.json и добавьте:

[{  
    "id": 1,  
    "first_name": "Ethelred",  
    "last_name": "Slowly",  
    "email": "eslowly0@google.es"  
},{  
    "id": 2,  
    "first_name": "Reta",  
    "last_name": "Woolmer",  
    "email": "rwoolmer1@miibeian.gov.cn"  
},{  
    "id": 3,  
    "first_name": "Arabel",  
    "last_name": "Pestor",  
    "email": "apestor2@bloglovin.com"  
}]  

Это простой JSON с тремя объектами. Ключи объектов (id, first_name, last_name, email) используются как заголовки таблицы, а их значения — как содержимое строк.

Создание компонента Table

Создайте файл Table.js в папке src и добавьте базовую структуру:

export default function Table({theadData, tbodyData}) {  
  return (  
      
            // header row  
              
          // body data  
        
); }

Компонент принимает theadData и tbodyData как props. theadData содержит заголовки (ключи объектов), tbodyData — массив объектов с данными.

В App.js добавьте функцию getHeadings(), которая берёт ключи первого объекта:

const getHeadings = () => {  
    return Object.keys(data[0]);  
}

Не забудьте импортировать data.json в App.js:

import data from "./data.json"  

И при рендере передать пропсы в Table:

Создание строки заголовка

Для отображения заголовков пропишите итерацию по theadData внутри thead:

{theadData.map(heading => { return })}

Для улучшения читаемости заголовков вы можете преобразовать ключи в человекочитаемый вид (см. секцию “Советы по улучшению заголовков”).

Создание строк тела таблицы

Тело таблицы формируется из массива объектов. Сначала итерируемся по массиву, затем — по ключам (theadData) для каждой строки:

{tbodyData.map((row, index) => { return // row data ; })}

Пример объекта строки:

const row = {  
    "id": 1,  
    "first_name": "Ethelred",  
    "last_name": "Slowly",  
    "email": "eslowly0@google.es"  
}  

Чтобы вывести значения, проходим по theadData и по каждому ключу берем соответствующее свойство в row:

// theadData contains the keys {theadData.map((key, index) => { return })} ;

Итоговый компонент Table выглядит так:

export default function Table({theadData, tbodyData}) {  
  return (  
   
{heading}
{row[key]}
{theadData.map(heading => { return })} {tbodyData.map((row, index) => { return {theadData.map((key, index) => { return })} ; })}
{heading}
{row[key]}
); }

В tbody компонент итерирует массив данных и возвращает tr для каждого объекта.

Использование компонента Table

Импортируйте Table в App.js и используйте так:

import Table from './Table';  
import data from "./data.json"  
  
function App() {  
  const getHeadings = () => {  
    return Object.keys(data[0]);  
  }  
  
  return (  
    
); } export default App;

Советы по улучшению заголовков и отображаемых значений

  • Преобразуйте ключи вида first_name в человекочитаемый вид: замените подчёркивания пробелами и сделайте первую букву заглавной. Это улучшает UX.
  • Для значений, таких как email, можно рендерить теги или кнопки “Копировать”.

Пример утилиты для заголовков (вставлять в код на ваш вкус):

Затем в заголовках:

Стилизация с CSS-модулями

Чтобы добавить локально scoped стили используйте CSS Modules. Например, создайте файл Table.module.css и импортируйте его в Table.js:

{humanize(heading)}
...

CSS-модули помогают избежать конфликтов глобальных классов и делают компонент портируемым.

Масштабирование и большие наборы данных

Доступность (a11y)