Расчет дополнительных реквизитов в стилизованном компоненте

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

const StyledColumns = styled.div.attrs({
    columnWidths: props => calculateColumnWidths(props)
})`

    display: grid;
    grid-column-gap: 40px;
    grid-row-gap: 20px;

    grid-template-columns: ${props => props.columnWidths[0]}

    // Use props.columnWidths a few more times...

`

Здесь есть две проблемы: (A) я получаю сообщение об ошибке, говорящее о том, что символы верхнего регистра не могут использоваться в именах атрибутов, и (B) это заставило меня понять, что атрибуты на самом деле добавляются в DOM в div. Я думал, что это просто удобный способ рассчитать дополнительные реквизиты.

Есть ли лучший способ сделать это, чтобы мне нужно было выполнить вычисления только один раз, но в визуализируемом DOM ничего не появилось?

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

Ответы 1

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

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

const StylisedColumn = React.memo(props => {
  const columnWidths = calculateColumnWidths(props);
  const Column = styled.div`
    display: grid;
    grid-column-gap: 40px;
    grid-row-gap: 20px;
    grid-template-columns: ${columnWidths[0]}

    // Use columnWidths a few more times...
  `;

  return <Column {...props} />;
});

используйте React.memo, чтобы избежать повторного рендеринга, как чистые компоненты :)

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