рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдбрд┐рдЬрд╝рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдирдорд╕реНрддреЗ, рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ UI-рдХрд┐рдЯ рдмрдирд╛рдиреЗ рдкрд░ рдЫреЛрдЯреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереАрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЖрдЬ рдореИрдВ рдПрдХ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреВрд░рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпреВрдЖрдИ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдЫрд╡рд┐

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ create-react-context рдореЙрдбреНрдпреВрд▓ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдЯрд╛рд╕реНрдХ рдЯреНрд░реА рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдирдП рдореАрдбрд┐рдпрд╛-рд╕рдВрджрд░реНрдн рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдирд╛рдо рджреЗрдВред

 media-context/ MediaConsumer/ MediaConsumer.js index.js MediaProvider/ MediaProvider.js index.js constants.js context.js index.js 

рд╣рдо рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реЗ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рдореАрдбрд┐рдпрд╛-рд╕рдВрджрд░реНрдн / index.js
 export { MediaProvider } from './MediaProvider'; export { MediaConsumer } from './MediaConsumer'; 

рд╡рд┐рд╖рдп-рд╕рдВрджрд░реНрдн / MediaConsumer / index.js
 export { MediaConsumer } from './MediaConsumer'; 

рд╡рд┐рд╖рдп-рд╕рдВрджрд░реНрдн / MediaProvider / index.js
 export { MediaProvider } from './MediaProvider'; 

рд╡рд┐рд╖рдп-рдкреНрд░рд╕рдВрдЧ / рд╕рдВрджрд░реНрдн.рдЬреЗрдПрд╕
рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, createContext ( createContext рдореЙрдбреНрдпреВрд▓ ) рдмрдирд╛рдПрдВред

 import createContext from 'create-react-context'; const { Provider, Consumer } = createContext(); export { Provider, Consumer }; 

рд╣рдо рдЖрдпрд╛рдд, рд╡рд┐рдирд╛рд╢ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рдореАрдбрд┐рдпрд╛-рд╕рдВрджрд░реНрдн / constants.js
рдпрд╣рд╛рдВ рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрд╡ рдХрд░реЗрдВред

 export const devices = ["mobile", "tablet", "desktop", "native"]; export const defaultDevice = "mobile"; 

рдПрдХ рдЕрдиреБрдХреВрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ 4 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдбреЗрд╕реНрдХрдЯреЙрдк, рдЯреИрдмрд▓реЗрдЯ, рдореЛрдмрд╛рдЗрд▓ рдФрд░ рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдореВрд▓)ред рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдХрд░рдг: рд╕реНрдорд╛рд░реНрдЯ рдЯреАрд╡реА, рдШрдбрд╝реА рдЖрджрд┐ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдореЛрдмрд╛рдЗрд▓ рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рд╖рдп-рд╕рдВрджрд░реНрдн / MediaProvider / MediaProvider.js
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкреНрд░рджрд╛рддрд╛ React.Context рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде "рдлреАрдб" рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рддреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреНрд░реЙрдкреНрд╕ device рдФрд░ touchable ред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ value рдкреНрд░рджрд╛рддрд╛ рдХреЛ рджрд┐рдП рдЧрдП рд╕рднреА value рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

 import React from "react"; import PropTypes from "prop-types"; import { Provider } from "../context"; import { devices, defaultDevice } from "../constanst"; function MediaProvider(props) { const device = devices.includes(props.device) ? props.device : props.defaultDevice; return <Provider value={{ ...props, device }}>{props.children}</Provider>; } MediaProvider.propTypes = { device: PropTypes.oneOf(devices), touchable: false, children: PropTypes.node }; MediaProvider.defaultProps = { device: defaultDevice, touchable: false }; export { MediaProvider }; 

рд╡рд┐рд╖рдп-рд╕рдВрджрд░реНрдн / MediaConsumer / MediaConsumer.js

рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, Consumer рд╕рдВрджрд░реНрдн рдХреЗ рдкреНрд░рддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдШрдЯрдХ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо children рдХреЛ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ: рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреНрдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдкрд░реНрд╢-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред

 import React from "react"; import PropTypes from "prop-types"; import { defaultTo } from "lodash"; import { devices, defaultDevice } from "../constanst"; import { Consumer } from '../context'; function MediaConsumer(props) { return ( <Consumer> {media => props.children({ touchable: defaultTo(media.touchable, props.defaultTouchable), device: defaultTo(media.device, props.defaultDevice), })} </Consumer> ) } MediaConsumer.propTypes = { defaultTouchable: PropTypes.bool, defaultDevice: PropTypes.oneOf(devices), children: PropTypes.func.isRequired }; MediaConsumer.defaultProps = { defaultDevice, defaultTouchable: false }; export { MediaConsumer }; 

рдЕрдм рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЖрдЗрдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 import React from "react"; import ReactDOM from "react-dom"; import { isMobile } from "react-device-detect"; import cx from "classnames"; import { ThemeConsumer, ThemeProvider } from "./theme-context"; import { MediaConsumer, MediaProvider } from "./media-context"; import "./styles.css"; function renderSVG({ device, touchable }) { if (device === "mobile" && touchable) { return "https://image.flaticon.com/icons/svg/124/124114.svg"; } if (device === "tablet" && touchable) { return "https://image.flaticon.com/icons/svg/124/124099.svg"; } if (device === "desktop") { return "https://image.flaticon.com/icons/svg/124/124092.svg"; } } function MyComponent() { const renderMyComponent = (theme, media) => { const myComponentClassName = cx("my-class", { "my-class-dark": theme === "dark", "my-class-light": theme === "light" }); return ( <div className="wrapperDiv"> <object className={myComponentClassName} data={renderSVG(media)} type="image/svg+xml" /> </div> ); }; return ( <MediaConsumer> {media => ( <ThemeConsumer> {theme => renderMyComponent(theme, media)} </ThemeConsumer> )} </MediaConsumer> ); } function App() { return ( <MediaProvider device={isMobile ? "mobile" : "desktop"} touchable={isMobile} > <ThemeProvider theme="light"> <MyComponent /> </ThemeProvider> </MediaProvider> ); } const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement); 

рдореАрдбрд┐рдпрд╛ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдореАрдбрд┐рдпрд╛ рдбрд┐рдЯреЗрдХреНрдЯрд░ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреЛрдИ рдореАрдбрд┐рдпрд╛ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕реЗ рд▓реЗрдВ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбрд┐рд╡рд╛рдЗрд╕-рдкрддрд╛ , рдЕрд░реНрдерд╛рдд рдЖрдИрдореЛрдмрд╛рдЗрд▓ рдлреНрд▓реИрдЧред

рд╕рдВрджрд░реНрдн рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдореАрдбрд┐рдпрд╛ рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХ рдХреЛ рд▓рдкреЗрдЯреЗрдВрдЧреЗред рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдореВрд▓реНрдп рдЬреЛ рдкреНрд░рджрд╛рддрд╛ рдЕрдкрдиреЗ рдЦрд╛рддреЗ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЙрдкрдХрд░рдг рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдХрд░реЗрдЧрд╛ред рдореИрдВ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рд╕реЗ рдЧрдпрд╛ рдерд╛, рд╣рдо рдХрдВрдкреНрдпреВрдЯрд░, рдбреЗрд╕реНрдХрдЯреЙрдк рд╕реЗ, рд╕рд╛рдЗрдЯ рдХрд╛ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рднреЗрдЬрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдп рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрд╕реНрдХрдЯреЙрдк рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВред

рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рджреЛ рд╕рдВрджрд░реНрдн рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдпреВрдЖрдИ-рдХрд┐рдЯ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╣реБрдореБрдЦреА рдФрд░ рд▓рдЪреАрд▓реЗ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рджреЛрдиреЛрдВ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред

рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

Source: https://habr.com/ru/post/hi463597/


All Articles