рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рд╖рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╕рдВрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдирдорд╕реНрддреЗ, рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╕реАрдзреЗ рдпрд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдпреВрдЖрдИ-рдХрд┐рдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрджреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЫрд╡рд┐

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп: рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЗрдВ, рдЬрд┐рд╕рдХреЗ рдШрдЯрдХ React.js рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП React.js ред рд╣рдо рджреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рд╖рдпреЛрдВ - рдЕрдВрдзреЗрд░реЗ рдФрд░ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

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

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ( src / ) рдЬрд┐рд╕реЗ рд╡рд┐рд╖рдп-рд╕рдВрджрд░реНрдн рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 theme-context/ ThemeConsumer/ ThemeConsumer.js index.js ThemeProvider/ ThemeProvider.js index.js constants.js context.js index.js 

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рд╣рдореЗрд╢рд╛ index.js рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдк рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рднреА рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдкрдХрд╛ рд╕рд┐рд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЛрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

 export { ThemeProvider } from './ThemeProvider'; export { ThemeConsumer } from './ThemeConsumer'; 

рд╡рд┐рд╖рдп-рд╕рдВрджрд░реНрдн / рдереАрдордХреЙрдВрд╕рд░ / рдЗрдВрдбреЗрдХреНрд╕ред рдЬреЗрдПрд╕

 export { ThemeConsumer } from './ThemeConsumer'; 

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

 export { ThemeProvider } from './ThemeProvider'; 

рд╡рд┐рд╖рдп-рдкреНрд░рд╕рдВрдЧ / рд╕рдВрджрд░реНрдн.рдЬреЗрдПрд╕

рдЕрдЧрд▓рд╛, рд╣рдо рдпрд╣рд╛рдБ рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ createContext ( createContext рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕рдВрджрд░реНрдн createContext ред

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

createContext рдЖрдпрд╛рдд createContext , рдЗрд╕реЗ Provider рдФрд░ Consumer рдореЗрдВ рдирд╖реНрдЯ рдХрд░реЗрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВред

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

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рдЪрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рди рдХрд░реЗрдВред

 export const themeLight = 'light'; export const themeDark = 'dark'; export const defaultTheme = themeLight; export const themes = [themeLight, themeDark]; 

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рджреЛ рд╡рд┐рд╖рдп рд╣реЛрдВрдЧреЗ - рдкреНрд░рдХрд╛рд╢ рдФрд░ рдЕрдВрдзреЗрд░рд╛ред

рд╡рд┐рд╖рдп-рдкреНрд░рд╕рдВрдЧ / ThemeProvider / ThemeProvider.js

рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ - рд╡рд╣ рдШрдЯрдХ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ React.Context рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ theme рдЬрд┐рд╕реЗ рдЗрд╕ Provider рд╕рднреА рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 import React from 'react'; import { Provider } from '../context'; import { defaultTheme, themes } from '../constants'; function ThemeProvider({ theme, children }) { return <Provider value={theme}>{children}</Provider>; } export { ThemeProvider }; 

рд╡рд┐рд╖рдп-рдкреНрд░рд╕рдВрдЧ / ThemeConsumer / ThemeConsumer.js

рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рд╣рдо рдХрдВрдЬреНрдпреВрдорд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП "рд╕реБрдирддрд╛ рд╣реИ, рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ"ред рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдмрдЪреНрдЪрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред Consumer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рдЬрд░реВрд░реА рд╣реИред

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ React Node рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдШрдЯрдХред

рдкреНрд░рд▓реЗрдЦрди рд╕реЗ: рддрд░реНрдХ рдХрд╛ рдореВрд▓реНрдп (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ {рд╡рд┐рд╖рдп => / * рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП * /}) рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП Provider рдкреЗрдбрд╝ рдореЗрдВ рдирд┐рдХрдЯрддрдо рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╣рд╛рд░рд╛ theme рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

 import React from 'react'; import { defaultTo } from 'lodash'; import { Consumer } from '../context'; import { defaultTheme, themes } from '../constants'; function ThemeConsumer(props) { return <Consumer>{theme => props.children(defaultTo(theme, props.defaultTheme))}</Consumer>; } export { ThemeConsumer }; 

рдпрд╣рд╛рдБ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
рдпрджрд┐ рд╡рд┐рд╖рдп рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рд╡рд┐рд╖рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ lodash - defaultTo рд╕реЗ lodash рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ defaultTo ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдпрд╣ рд╕рдм, рд╡рд┐рд╖рдп рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ!

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдШрдЯрдХ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реБрдиреЗрдЧрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ред

 .my-class { font-family: sans-serif; text-align: center; font-size: 30px; } .my-class-light { color: #39cccc; } .my-class-dark { color: #001a33; } 

 import React from "react"; import ReactDOM from "react-dom"; import cx from "classnames"; import { ThemeConsumer, ThemeProvider } from "./theme-context"; import "./styles.css"; function MyComponent() { const renderMyComponent = theme => { const myComponentClassName = cx("my-class", { "my-class-dark": theme === "dark", "my-class-light": theme === "light" }); return ( <div className={myComponentClassName}> <h1>    </h1> </div> ); }; return <ThemeConsumer>{theme => renderMyComponent(theme)}</ThemeConsumer>; }; function App() { return ( <MyComponent /> ); } const rootElement = document.getElementById("root"); ReactDOM.render( //      theme  dark <ThemeProvider theme="light"> <App /> </ThemeProvider> , rootElement); 

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рдЕрдкрдирд╛ <App /> рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рдереАрдо рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ-рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдИ рд╣реИред рдЕрдЧрд▓рд╛, <App /> рд░рд┐рдЯрд░реНрди <MyComponent /> , рдпрд╣ , рдФрд░ рдпрд╣ рд╣рдорд╛рд░рд╛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдереАрдо рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд┐рд╖рдп рд╣реИ:

 <ThemeConsumer>{theme => renderMyComponent(theme)}</ThemeConsumer> 

рдШрдЯрдХ рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  const renderMyComponent = theme => { //      }; 

рдХрд╛рд░реНрдп рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

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

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

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


All Articles