Адаптивные веб-страницы с помощью React-Response и TypeScript

В этом руководстве мы узнаем о react-responsive библиотеке и о том, как использовать ее с TypeScript в наших проектах. Мы также применим знания из этого руководства для создания простого адаптивного приложения-портфолио. Позвольте кратко объяснить некоторые знания о реальном значении реализации адаптивных веб-приложений.

Что такое адаптивный веб-дизайн?

Содержание статьи:

Согласно MDN, отзывчивый веб-дизайн (RWD) — это подход к веб-дизайну, который позволяет веб-страницам хорошо отображаться на различных устройствах и размерах окон или экранов от минимального до максимального размера отображения. Последние исследования также рассматривают близость зрителя к части контекста просмотра как расширение для RWD. Контент, дизайн и производительность необходимы на всех устройствах, чтобы обеспечить удобство использования.

Реализация RWD в веб-приложениях дает таким приложениям возможность легко настраиваться и адаптироваться к постоянному изменению размеров экрана на устройствах. Создание приложений, которые являются адгезивными RWD, означает, что это веб-приложение имеет плавные и пропорциональные сетки, гибкие изображения и медиа-запросы CSS3, являющиеся расширением правила @media. В этом руководстве мы сосредоточимся на части медиа-запросов при реализации RWD в веб-приложении.

Что такое React-response?

React-responsive — это модуль медиа-запросов, который предоставляет медиа-запросы CSS в качестве компонента или хука для адаптивного веб-дизайна. Это очень полезно для рендеринга или удаления определенных стилизованных элементов в DOM — реструктуризировать DOM с точки зрения стилей CSS / Sass, в зависимости от разрешения / размера экрана.

React JS. Основы

Изучите основы ReactJS на практическом примере по созданию учебного веб-приложения

Получить курс сейчас!

Использование react-responseive в наших проектах означает, что мы можем легко разделить контент, который хотим отображать, без написания для него каких-либо дополнительных стилей. Эти стили обрабатываются под капотом, предоставляя нам компонент или интерфейс хука, который мы можем использовать для установки значений max-width или min-width. Эти значения определяют, на каких размерах экрана содержимое будет отображаться или скрываться.

React-response или стилизованные компоненты

Прежде чем мы проведем сравнение между этими инструментами, стоит отметить, что в то время как react-responsive был сделан для брейкпоинтов с помощью пользовательских компонентов, стилизованные компоненты были сосредоточены на создании компонентов с пользовательскими стилями CSS. Это означает, что эти два инструмента можно объединить вместе, чтобы добавить на веб-страницу больше возможностей CSS. В то время как react-responsive больше фокусируются на инкапсуляции в качестве брейкпоинтов, стилизованные компоненты сосредоточены на добавлении большего количества стилей CSS через пользовательские компоненты.

Повышение качества ваших стилизованных компонентов потребует обработки медиа-запросов с помощью react-responsive, как показано ниже:

JavaScript … const SampleComponent = (props) => { … return( <div> <ReactResponsive breakpoint={1040}> <StyledComponents {…props}> </ReactResponsive> <ReactResponsive breakpoint={786}> <StyledComponents {…props}> </ReactResponsive> </div> ) } …

12345678910111213141516 …const SampleComponent = (props) => {  …  return(    <div>      <ReactResponsive breakpoint={1040}>        <StyledComponents {…props}>      </ReactResponsive>       <ReactResponsive breakpoint={786}>        <StyledComponents {…props}>      </ReactResponsive>    </div>  )}…

Выше представлен возможный код объединения двух библиотек для создания более отзывчивых веб-приложений. При размерах экрана в пределах минимальной ширины 1040 пикселей дочерние компоненты, то есть <StyledComponents {… props}>, будут отображаться на экране. Та же концепция применяется и ко второму компоненту <ReactResponsive breakpoint = {786}>.

Реализация React-responsive

В следующих частях этого руководства мы обсудим и исследуем реализацию React-responseive как в качестве хука, так и в качестве компонента. Мы также объединим эти два подхода вместе, таким образом, рассмотрим любую возможную реализацию react-responsive, которую вам необходимо знать, прежде чем создавать хорошо адаптивное приложение. Давайте начнем с настройки react-responsive в качестве хука в проекте React:

JavaScript import { useMediaQuery } from “react-responsive”; const App = () => { const isDesktop = useMediaQuery({ query: “(min-width: 1224px)” }); const isTablet = useMediaQuery({ query: “(max-width: 1224px)” }); const isMobile = useMediaQuery({ query: “(max-width: 786px)” }); const isPortrait = useMediaQuery({ query: “(orientation: portrait)” }); const isRetina = useMediaQuery({ query: “(max-resolution: 300dpi)” }); return ( <Wrapper> { isDesktop ? <DesktopView /> : <MobileView /> } {isTablet && <Tablet />} <p>This is {isPortrait ? ‘portrait’ : ‘landscape’} orientation</p> {isRetina && <p>You are testig retina</p>} </div> </Wrapper> ) }

1234567891011121314151617181920212223242526272829303132333435 import { useMediaQuery } from “react-responsive”; const App = () => {  const isDesktop = useMediaQuery({    query: “(min-width: 1224px)”  });   const isTablet = useMediaQuery({    query: “(max-width: 1224px)”  });   const isMobile = useMediaQuery({    query: “(max-width: 786px)”  });   const isPortrait = useMediaQuery({    query: “(orientation: portrait)”  });   const isRetina = useMediaQuery({    query: “(max-resolution: 300dpi)”  });   return (    <Wrapper>      {        isDesktop ? <DesktopView /> : <MobileView />      }      {isTablet && <Tablet />}      <p>This is {isPortrait ? ‘portrait’ : ‘landscape’} orientation</p>      {isRetina && <p>You are testig retina</p>}  </div>    </Wrapper>  )}

Используя хук useMediaQuery, предоставляемый react-responsive, мы смогли создать логику брейкпоинта в нашем коде. Компоненты, прошедшие валидацию isDesktop, будут отображаться только на экранах с областью просмотра больше 1224 пикселей. В то время как isTablet и isMobile будут отображать компоненты на экранах с областью просмотра до 1224 пикселей и 786 пикселей соответственно.

Далее, настроим react-responsive как компонентный интерфейс:

JavaScript import MediaQuery from “react-responsive”; const App = () => ( <Wrapper> <MediaQuery minWidth={1224}> <DeskTopView>This will display in desktop screen</DeskTopView> <MediaQuery minWidth={1824}> <Banner text=”this will dsiplay on larger screen size” /> </MediaQuery> </MediaQuery> <MediaQuery minResolution=”2dppx”> {(matches) => matches ? <Retina>This is a retina view</Retina> : <div>This isn’t a retina</div> } </MediaQuery> </Wrapper> )

12345678910111213141516171819 import MediaQuery from “react-responsive”; const App = () => (  <Wrapper>    <MediaQuery minWidth={1224}>      <DeskTopView>This will display in desktop screen</DeskTopView>      <MediaQuery minWidth={1824}>        <Banner text=”this will dsiplay on larger screen size” />      </MediaQuery>    </MediaQuery>    <MediaQuery minResolution=”2dppx”>      {(matches) =>        matches          ? <Retina>This is a retina view</Retina>          : <div>This isn’t a retina</div>      }    </MediaQuery>  </Wrapper>)

Приведенный выше фрагмент кода дает нам представление о том, как мы можем использовать компонент MediaQuery, а затем передать брейкпоинт в качестве props в компонент. Также в <MediaQuery minResolution = «2dppx»> мы использовали функцию (render prop) в качестве дочернего элемента для программного выбора дочерних свойств компонента.

Последняя концепция перед тем, как мы реализуем React-responseive в нашем проекте портфолио, заключается в том, как инициировать событие с помощью свойства onChange в компоненте MediaQuery или в качестве обратного вызова в нашем хуке useMediaQuery.

JavaScript import MediaQuery, { useMediaQuery } from “react-responsive”; const App = () => { const handleMediaQueryChange = (matches) => { if(matches) { // do something if true } else { // do something if false } }; const isDesktop = useMediaQuery( { minWidth: 1224 }, undefined, handleMediaQueryChange ); return ( <Wrapper> <MediaQuery minWidth={1224} onChange={handleMediaQueryChange}> … </MediaQuery> {“or”} {isDesktop && <div>Welcome to desktop view…</div>} </Wrapper> ) }

123456789101112131415161718192021222324 import MediaQuery, { useMediaQuery } from “react-responsive”; const App = () => {  const handleMediaQueryChange = (matches) => {    if(matches) {      // do something if true    } else {      // do something if false    }  };  const isDesktop = useMediaQuery(    { minWidth: 1224 }, undefined,  handleMediaQueryChange  );   return (    <Wrapper>      <MediaQuery minWidth={1224} onChange={handleMediaQueryChange}>      …      </MediaQuery>      {“or”}      {isDesktop && <div>Welcome to desktop view…</div>}    </Wrapper>  )}

В приведенном выше коде мы присоединяем функцию обратного вызова handleMediaQueryChange к хуку useMediaQuery для обработки события onChange, которое возникает при изменении ширины окна просмотра браузера на 1224 пикселей. Это также относится к компоненту MediaQuery, где функция handleMediaQueryChange выполняется свойством onChange компонента.

React JS. Основы

Изучите основы ReactJS на практическом примере по созданию учебного веб-приложения

Получить курс сейчас!

Реализация React-responsive с TypeScript

В этом проекте мы будем использовать Styled-components библиотеку для применения основных стилей к пользовательским компонентам. Затем мы воспользуемся React-responseive библиотекой, чтобы добавить медиа-запросы для брейкпоинтов. Давайте клонируем наш проект из GitHub в папку портфолио с помощью следующей команды, затем переместим каталог в эту папку и установим все необходимые зависимости.

JavaScript git clone https://github.com/IkehAkinyemi/react-responsive-portfolio portfolio cd portfolio yarn install

123 git clone https://github.com/IkehAkinyemi/react-responsive-portfolio portfoliocd portfolioyarn install

Запустим проект с помощью команды yarn start в терминале, а в браузере перейдем по адресу localhost:3000 /experience, чтобы познакомится с текущим интерфейсом перед реализацией нашего медиа-запроса.

Теперь давайте начнем с простейшей реализации react-responsive, определив, какой контент отображается в окнах просмотра на десктопе и на мобильных устройствах.

JavaScript import Projects from “./Projects”; import MediaQuery from “react-responsive”; … const Experience = () => { … return ( <div className=”container max-w-screen-lg mx-auto”> <div className=”mt-8″> <MediaQuery maxWidth={786}> <h1 className=”text-3xl text-center mb-6 z-50″> For desktop view only </h1> </MediaQuery> <MediaQuery minWidth={1224}> <Projects /> </MediaQuery> </div> </div> ); }; export default Experience;

12345678910111213141516171819202122 import Projects from “./Projects”;import MediaQuery from “react-responsive”;…const Experience = () => {  …  return (    <div className=”container max-w-screen-lg mx-auto”>      <div className=”mt-8″>        <MediaQuery maxWidth={786}>          <h1 className=”text-3xl text-center mb-6 z-50″>            For desktop view only          </h1>        </MediaQuery>         <MediaQuery minWidth={1224}>          <Projects />        </MediaQuery>      </div>    </div>  );};export default Experience;

Мы обновили наше приложение, чтобы отображать элемент h1 только в мобильном представлении, в то время как список карточек для проектов, то есть компонент <Project />, отображается только в области просмотра больше 1224 пикселей.

Затем давайте обновим компонент Card в файле src/experience/Project.tsx. Сделаем содержимое пользовательского компонента Glass видимым только в области просмотра десктопа.

JavaScript import { useMediaQuery } from “react-responsive”; … const Card = ({ img, name, description }: CProps) => { const isDesktop = useMediaQuery({ query: “(min-width: 1224px)” }); return ( <Wrapper bg={img} className=”SpinWhot project”> <div className=”project-name-holder”> <p className=”project-name-holder-SpinWhot project-title”>{name}</p> </div> <Glass className=””>{isDesktop && description}</Glass> </Wrapper> ); }; …

1234567891011121314151617 import { useMediaQuery } from “react-responsive”;…const Card = ({ img, name, description }: CProps) => {  const isDesktop = useMediaQuery({    query: “(min-width: 1224px)”  });   return (    <Wrapper bg={img} className=”SpinWhot project”>      <div className=”project-name-holder”>        <p className=”project-name-holder-SpinWhot project-title”>{name}</p>      </div>      <Glass className=””>{isDesktop && description}</Glass>    </Wrapper>  );};…

Наш обновленный интерфейс при просмотре на экране десктопа будет выглядеть так, как показано ниже:

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

JavaScript import { useMediaQuery } from “react-responsive”; … const Card = ({ img, name, description }: CProps) => { const handleMediaQueryChange = (matches: boolean) => { if(matches) { window.alert(“Trigger a window’s alert at viewport of 1244px”) } }; const isDesktop = useMediaQuery( { minWidth: 1224 }, undefined, handleMediaQueryChange ); return ( <Wrapper bg={img} className=”SpinWhot project”> <div className=”project-name-holder”> <p className=”project-name-holder-SpinWhot project-title”>{name}</p> </div> <Glass className=””>{isDesktop && description}</Glass> </Wrapper> ); }; …

123456789101112131415161718192021222324 import { useMediaQuery } from “react-responsive”;…const Card = ({ img, name, description }: CProps) => {  const handleMediaQueryChange = (matches: boolean) => {    if(matches) {    window.alert(“Trigger a window’s alert at viewport of 1244px”)    }  };   const isDesktop = useMediaQuery(    { minWidth: 1224 }, undefined,  handleMediaQueryChange  );   return (    <Wrapper bg={img} className=”SpinWhot project”>      <div className=”project-name-holder”>        <p className=”project-name-holder-SpinWhot project-title”>{name}</p>      </div>       <Glass className=””>{isDesktop && description}</Glass>    </Wrapper>  );};…

Приведенный выше фрагмент вызовет функцию window.alert для отображения предупреждения в браузере всякий раз, когда мы изменяем ширину нашего браузера до 1224 пикселей.

Заключение

Построение с помощью React-responseive дает возможность использовать его вместе с другими библиотеками, ориентированными на CSS, для создания адаптивных веб-страниц. Мы можем расширить знания из этого руководства, чтобы быстро построить сетку для экранов разных размеров. Также мы можем разделить компоненты нашего приложения на модули для отображения в зависимости от того, в каком окне просмотра мы их установили. Кроме того, различные интерфейсы поддержки, предоставляемые React-responseive, варьируются от сверхбольших экранов до экранов умных часов, что делает React-responseive хорошей библиотекой для создания дизайна пользовательского интерфейса для небольших экранов от начала и до конца без написания каких-либо медиа-запросов CSS. Вот ссылка на GitHub для загрузки кода, используемого для нашего проекта.

Автор: Ikeh Akinyemi

Источник: webformyself.com

Comments (0)
Add Comment