Отреагируйте, как отобразить один элемент, который получил несколько дочерних элементов в разных в строке таблицы

#reactjs #typescript

#reactjs #машинописный текст

Вопрос:

Я новичок в React. У меня есть следующий блок кода, который возвращается и отправляется компоненту для рендеринга в HTML-таблице. В настоящее время я использую что-то вроде приведенного ниже. есть ли лучший способ

 bodyItems = sorted.map((data) => [
  data.employerName,
  data.sectors.map((sector) => <div>{sector.name}</div>),
  data.sectors.map((sector) => (
    <div>
      {sector.assignedLearners > 0
        ? `${sector.assignedLearners} learners`
        : 'Unassigned'}
    </div>
  )),
  data.lastModified
  ]
 

Рендеринг как:

 bodyItems.map((entry, rowIndex) => (
    <tr key={rowIndex}>
      {entry.map((cell, colIndex) => (
        <td key={colIndex}>{cell}</td>
      ))}
    </tr>
  ))
 

Кто-нибудь может помочь, как отобразить каждый div секторов в отдельном компоненте.

Ожидаемый результат:

 <tr>
  <td>Employer Name</td>
  <td>
    <div>Sector 1</div>
    <div>Sector 2</div>
  </td>
  <td>
    <div>20 Learners</div>
    <div>10 learners</div>
   </td>
  <td>
  <!-- ... additional properties-->
  </td>
</tr>
 

Спасибо

Ответ №1:

Вы хотите сказать , что хотите превратить каждый фрагмент , который вы сопоставили , data.sectors в свой собственный <td> ? Таким образом, вы получаете структуру таблицы, подобную этой?

 <tr>
  <td>Employer Name</td>
  <td>
    <div>Sector 1</div>
    <div>2 learners</div>
  </td>
  <td>
    <div>Sector 2</div>
    <div>Unknown</div>
  </td>
  <!-- ... additional sectors -->
</tr>
 

Если это так, вам нужно сгладить созданный массив data.sectors.map , чтобы в итоге не получился вложенный массив. Вы можете сделать это с помощью spread operator ( ... ), предполагая, что ваш проект его поддерживает.

 bodyItems = sorted.map((data) => [
  data.employerName,
  ...data.sectors.map((sector) => (
    <>
      <div>{sector.name}</div>
      <div>
        {sector.assignedLearners > 0
          ? `${sector.assignedLearners} learners`
          : 'Unassigned'}
      </div>
    </>
  ))
])
 

В качестве альтернативы вы могли бы использовать flatMap .

 bodyItems = sorted.flatMap((data) => [
  data.employerName,
  data.sectors.map((sector) => (
    <>
      <div>{sector.name}</div>
      <div>
        {sector.assignedLearners > 0
          ? `${sector.assignedLearners} learners`
          : 'Unassigned'}
      </div>
    </>
  ))
])