Отзывчивая маржа с React

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

Вот (довольно простая) проблема:

<Margin top = "10%" left = "5%">
    <Card>Some text</Card>
</Margin>

Компонент Margin извлекает настройки полей из компонента Card, чтобы компонент Card можно было повторно использовать в других сценариях. Сам компонент Margin также можно использовать повторно.

Если бы кто-то хотел сделать это отзывчивым, это было бы возможно только с помощью других свойств, таких как topPhone, topTablet и т. д., Что я считаю очень неинтуитивным и трудным для поддержания, если границы отзывчивости когда-либо изменятся.

Итак, что можно сделать, так это скопировать весь контент в разные другие компоненты и отобразить только тот, который в настоящее время подходит (например, компонент MediaQuery response-responseive).

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

Как лучше всего подойти к этому?

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

Ответы 2

Вы уже проверяли реагирующие носки? Это помогает создавать отзывчивые компоненты React.

<Breakpoint topPhone only>
  <div>I will render only in topPhone</div>
</Breakpoint>

<Breakpoint topTablet only>
  <div>I will render only in topTablet</div>
</Breakpoint>

Отказ от ответственности: я являюсь автором этой библиотеки.

Как я описал, подобные подходы приводят к накладным расходам для устройств разных размеров, если вы сравниваете вывод React. Я ищу решение без накладных расходов.

NikxDa 11.12.2018 03:02

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

1) Настройте объект с желаемыми адаптивными границами:

const screenSize = {
  sm: 576,
  md: 768,
  lg: 992,
};

2) Создайте Theme, чтобы помочь преодолеть эти границы через ваше приложение через стилизованные компоненты. Здесь я настроил их с учетом точек останова (медиа-запросов), используя что-то вроде Bootstrap в качестве ориентира (их следует расширить, включив smMin, mdMin и т. д.):

const theme = () => {
  return {
    xsMax: screenSize.sm - 1 + 'px',
    smMax: screenSize.md - 1 + 'px',
    mdMax: screenSize.lg - 1 + 'px',
  };
};

3) Оберните ваше приложение своим Тема, упомянутая здесь.

render() {
  return (
    <ThemeProvider theme = {theme}>
      <MyApplication />
    </ThemeProvider>
  )
}

4) На примере Советы и уловки styled-components. Создайте экспортируемый помощник media, чтобы использовать эти точки останова Темы (я покажу только 2 точки останова, но вы должны расширить это, чтобы включить xsDown, smDown, lgUp, mdOnly и т. д.)

export const media = {
  smDown: (...args) => css`
    @media (max-width: ${({ theme }) => theme.smMax}) {
      ${css(...args)};
    }
  `,
  mdDown: (...args) => css`
    @media (max-width: ${({ theme }) => theme.mdMax}) {
      ${css(...args)};
    }
  `,
};

5) import media и используйте его как обычный старый media-query, обертывая ваш отзывчивый стиль:

const MyComponent = styled('section')`
  /* Everything to be pink on screens with widths < 768px */
  ${media.smDown`
    * {
      background: papayawhip;
    }
  `};
`;

const MyOtherComponent = styled(‘li’)`
  /* Everything to be purple on screens with widths < 992px */
  ${media.mdDown`
    * {
      background: purple;
    }
  `};
`;

Вы можете import media и повторно использовать его в Margin или любом другом компоненте вашего приложения. Отзывчивые границы поддерживаются в одном месте.

Это хорошее решение для медиа-запросов, но не отвечает на мой вопрос. Мне нужно изменить поля, о которых компонент не должен знать. Сам компонент маржи должен быть многоразовым. Поэтому такой подход - не то, что я искал. Прости

NikxDa 22.12.2018 05:28

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