React pdf отображает максимальное количество элементов на странице

Я пытаюсь создать функцию для создания PDF-файла со списком qr-кода. Количество qr-кодов может быть большим, поэтому я хочу ограничить количество qr-кодов максимум 9 и 3 qr-кода подряд. Что мне следует сделать, чтобы добиться этого?

function QrCodePDF(props: QrCodeInfo[]) {
  const qrCodeInfo = props;
  const qrCodeItems: QrCodeInfo[] = [];

  for (let index in qrCodeInfo) {
    qrCodeItems.push({
      dealTitle: qrCodeInfo[index]!.dealTitle,
      qrCodeId: qrCodeInfo[index]!.qrCodeId,
      qrCodeUrl: qrCodeInfo[index]!.qrCodeUrl,
    });
  }

  return (
    <Document>
      <Page
        size = "A4"
        style = {{
          flexDirection: 'column',
          backgroundColor: '#fff',
          color: '#000',
          padding: 10,
        }}
        wrap = {true}
      >
        <View
          style = {{
            flex: 1,
            width: '100%',
            border: '1px solid #000',
          }}
          key = {'QrCodeTable'}
        >
          <View
            style = {{
              display: 'flex',
              width: '100%',
              fontWeight: 'bold',
              fontSize: '20px',
              textAlign: 'center',
              flexDirection: 'row',
              alignItems: 'center',
              borderBottom: '1px solid #000',
            }}
          >
            <Text
              style = {{
                width: '100%',
                padding: 10,
              }}
            >
              Qr Code for {qrCodeItems[0]?.dealTitle}
            </Text>
          </View>
          <View
            style = {{
              display: 'flex',
              flexWrap: 'wrap',
              flexDirection: 'row',
              alignItems: 'center',
              justifyContent: 'center',
            }}
            key = {'QrCodeWrapper'}
          >
            {qrCodeItems.map((item, index) => {
              return (
                <View
                  key = {index}
                  style = {{
                    width: '33.33%',
                    alignItems: 'center',
                    flexDirection: 'row',
                    fontWeight: 'normal',
                    fontSize: '14px',
                    textAlign: 'left',
                    color: '#000',
                    flexWrap: 'wrap',
                    gap: 0,
                  }}
                  break = {index > 3}
                  wrap = {true}
                >
                  <Image
                    src = {item.qrCodeUrl}
                    style = {{ width: '100%', padding: 10 }}
                  ></Image>
                </View>
              );
            })}
          </View>
        </View>
      </Page>
    </Document>
  );
}

Это код, который я пробовал, но он работает не так, как я думаю. Что я могу попробовать дальше?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пытаюсь разобраться в себе, используя Array.from с .splice

const renderPage = (items: QrCodeInfo[], maximumQuantityPerPage: number) => {
  const viewItems = Array.from(
    { length: Math.ceil(items.length / maximumQuantityPerPage) },
    () => items.splice(0, maximumQuantityPerPage)
  );

  const renderedItem = viewItems.map(item => {
    return (
      <Page
        size = "A4"
        style = {{
          flexDirection: 'column',
          backgroundColor: PRIMARY_COLOR,
          color: BLACK,
          padding: 10,
        }}
        wrap = {true}
      >
        <View
          style = {{
            border: `1px solid ${BLACK}`,
            height: '100%',
          }}
        >
          <View
            style = {{
              textAlign: 'center',
              fontSize: '20px',
              fontWeight: 'bold',
              display: 'flex',
              padding: 10,
              borderBottom: `1px solid ${BLACK}`,
              justifyContent: 'center',
              fontFamily: 'Poppins',
            }}
          >
            <Text>Qr code for {item[0]?.dealTitle}</Text>
          </View>
          <View
            style = {{
              display: 'flex',
              flexWrap: 'wrap',
              flexDirection: 'row',
              alignItems: 'flex-start',
              justifyContent: 'flex-start',
            }}
            key = {'QrCodeWrapper'}
          >
            {item.map((qrCode, index) => {
              return (
                <View
                  key = {index}
                  style = {{
                    width: '33.33%',
                    color: BLACK,
                    padding: 10,
                  }}
                  break = {index > 2}
                  wrap = {false}
                >
                  <Image
                    src = {qrCode.qrCodeUrl}
                    style = {{
                      width: '100%',
                      padding: 10,
                      backgroundColor: LIGHT_RED,
                    }}
                  ></Image>
                </View>
              );
            })}
          </View>
        </View>
      </Page>
    );
  });

  return renderedItem;
};

const QrCodePDF = (props: QrCodeInfo[]) => {
  const qrCodeInfo = props;
  const qrCodeItems: QrCodeInfo[] = [];

  for (let index in qrCodeInfo) {
    qrCodeItems.push({
      dealTitle: qrCodeInfo[index]!.dealTitle,
      qrCodeId: qrCodeInfo[index]!.qrCodeId,
      qrCodeUrl: qrCodeInfo[index]!.qrCodeUrl,
    });
  }

  return <Document>{renderPage(qrCodeItems, 12)}</Document>;
};

Другие вопросы по теме