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

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп: рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЗрдВ, рдЬрд┐рд╕рдХреЗ рдШрдЯрдХ
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 => {
рдХрд╛рд░реНрдп рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрдкрдпреЛрдЧреА рд▓рдЧреА рд╣реЛрдЧреАред рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдПрдХ
рдореАрдбрд┐рдпрд╛-рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЙрдкрдХрд░рдг рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдШрдЯрдХреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред
рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж