Hai, ini posting pertama saya di Habr. Saya harap Anda akan tertarik.
Jadi, saya ingin memulai serangkaian posting yang secara langsung atau tidak langsung terkait dengan pembuatan ui-kit.

Tujuan dari posting ini: Temukan solusi untuk mengontrol tema aplikasi yang komponennya diimplementasikan di 
React.js . Kami akan menggunakan dua tema global - 
gelap dan 
terang .
Dalam contoh ini, saya akan menggunakan modul 
create-react-context untuk membuat konteks.
Kami mulai dengan membuat folder di root proyek ( 
src / ) yang disebut 
tema-konteks . Struktur folder ini akan terlihat seperti ini:
 theme-context/ ThemeConsumer/ ThemeConsumer.js index.js ThemeProvider/ ThemeProvider.js index.js constants.js context.js index.js 
Secara pribadi, saya selalu mulai dengan file 
index.js . Anda melakukan semua impor dan ekspor di awal, dan kemudian kepala Anda tidak sakit tentang mereka.
theme-context / index.js export { ThemeProvider } from './ThemeProvider'; export { ThemeConsumer } from './ThemeConsumer'; 
theme-context / ThemeConsumer / index.js export { ThemeConsumer } from './ThemeConsumer'; 
theme-context / ThemeProvider / index.js export { ThemeProvider } from './ThemeProvider'; 
theme-context / context.jsSelanjutnya, kita akan membuat konteks menggunakan 
createContext (maaf untuk permainan kata-kata), menggunakan modul 
dari sini .
 import createContext from 'create-react-context'; const { Provider, Consumer } = createContext(); export { Provider, Consumer }; 
Impor 
createContext , hancurkan ke 
Provider dan 
Consumer , dan ekspor mereka.
theme-context / constants.jsSemuanya sederhana di sini, kami membuat variabel kami agar tidak mencemari file utama.
 export const themeLight = 'light'; export const themeDark = 'dark'; export const defaultTheme = themeLight; export const themes = [themeLight, themeDark]; 
Seperti yang saya katakan sebelumnya, aplikasi kita akan memiliki dua tema - terang dan gelap.
theme-context / ThemeProvider / ThemeProvider.jsDi sini kita akan berbicara tentang penyedia - komponen yang tersedia di setiap objek 
React.Context . Ini memungkinkan konsumen untuk mendengarkan dan menanggapi konteks yang berubah.
Dalam contoh kami, prop 
adalah 
theme yang akan diteruskan ke semua arus 
Provider ini a.
 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 }; 
theme-context / ThemeConsumer / ThemeConsumer.jsDalam file ini kami akan bekerja dengan Konsumen - ini adalah komponen yang "mendengarkan, menunggu" untuk perubahan konteks. Anak dari komponen ini adalah suatu fungsi. Ini adalah suatu keharusan ketika menggunakan 
Consumer .
Fungsi ini menerima nilai-nilai konteks saat ini dan mengembalikan 
React Node , dengan kata lain, komponen.
Dari dokumentasi: nilai argumen (dalam kasus kami {theme => / * untuk memvisualisasikan sesuatu berdasarkan nilai konteks * /}) akan sama dengan 
theme orangtua terdekat di pohon 
Provider untuk konteks ini.
 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 }; 
Di sini perlu diperhatikan hal-hal berikut:
Jika tema tidak dipilih secara eksplisit, kita perlu tema komponen yang akan dipilih secara otomatis, untuk ini saya menggunakan 
lodash dari 
lodash - 
defaultTo . Namun, fungsi ini dapat dicapai dengan banyak cara lain.
Itu saja, konteks tema siap digunakan!
Mari kita lihat bagaimana cara menerapkannya. Mari kita membuat komponen sederhana yang akan mendengarkan dan menanggapi konteks aplikasi kita.
 .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); 
Jadi, kami membungkus 
<App /> di penyedia, dan sekarang temanya telah tersedia untuk semua komponen-konsumen dalam aplikasi kami. Selanjutnya, 
<App /> mengembalikan 
<MyComponent /> , ini adalah 
, dan itu akan membuat komponen kita dan meneruskannya dengan tema aplikasi kita. Dan sudah memiliki topik sebagai argumen:
 <ThemeConsumer>{theme => renderMyComponent(theme)}</ThemeConsumer> 
kita dapat menggunakannya saat membuat komponen
  const renderMyComponent = theme => {  
Kode kerja dapat ditemukan di sini .
Itu saja, saya harap Anda menemukan posting ini bermanfaat. Dalam posting berikutnya saya akan mencoba untuk membuat 
konteks media , yang fungsinya akan membantu kami memvisualisasikan komponen pada peralatan perangkat pengguna.
Terima kasih