Используйте свойства для переключения ширины с помощью миксинов стилизованных компонентов

Используемая технология — стилизованные компоненты и реакция

У меня есть миксин, чтобы сделать мое приложение отзывчивым

import { css } from 'styled-components';

export default {
  smallScreen: (...args: any) => css`
    @media (max-width: 600px) {
      ${css(...args)}
    }
  `,
}

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

const SideNavWrapper = styled.article`
  background: red; // this works
  width: ${props => props.expanded ? '260px' : '80px'}; // this works

  ${media.smallScreen({
    background: 'yellow', // this works
    width: `${props => props.expanded ? '100%' : '20px'}`, // this doesn't work. props is undefined.
  })}
`;

В зависимости от props.expanded я хочу переключить ширину SideNavWrapper. Однако это не работает на небольших экранах. Цвет фона меняется, как и ожидалось, но не ширина. При отладке я понял, что реквизит не определен. Любые идеи, что мне не хватает? Большое спасибо!

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
1 107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы бы попробовали:

${props => {
return (media.smallScreen({
  background: 'yellow', 
  width: `${props.expanded ? '100%' : '20px'}`,
}))
}}

Это работает. Большое спасибо. Однако ваше решение требует незначительного исправления синтаксиса. ${props => { return (media.smallScreen({ background: 'желтый', width: ${props.expanded ? '100%' : '20px'}, })) } }

Cute_Ninja 10.04.2019 21:25

@Ishita рад помочь. Нужен ли строковый литерал? Я думаю, (props.expanded ? '100%' : '20px') было бы более элегантно.

xDreamCoding 10.04.2019 21:27

Согласованный. Строковый литерал был там только потому, что я скопировал эту строку сверху.

Cute_Ninja 10.04.2019 21:31

Другой способ, который вы могли бы использовать и, на мой взгляд, был бы намного чище для чтения и, следовательно, удобным для обслуживания, заключается в следующем:

const getCorrectWidth = ({ expanded }) => (
  expanded
    ? 260
    : 80
);

const getCorrectSmallWidth = ({ expanded }) => (
  expanded
    ? '100%'
    : '20px'
);

const SideNavWrapper = styled.article`
  background: red;
  width: ${getCorrectWidth}px;

  ${media.smallScreen`
    background: yellow;
    width: ${getCorrectSmallWidth}
  `}
`;

Вышеупомянутое имеет четкие функции, которые сообщают разработчику, что он делает. Синтаксис тоже выглядит чистым.

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