Автор оригинала: Thomas Findlay.
В Rection 16.3 контекст API наконец остановился, будучи экспериментальной API и стал очень полезной особенностью, которая теперь может быть безопасно используется в производстве. Время, когда мы должны были решить, будем ли мы проходить опоры от родителя вниз до дна через несколько компонентов, которые даже не используют опоры или использовать redux для этого вместо этого, к счастью, позади к нам.
Вместо пропорации мы можем теперь использовать контекст API для создания провайдера со значениями, которые мы хотим сделать доступным для дочернего компонента. В дочернем компоненте мы можем просто использовать потребитель для пропущенных значений доступа.
Начнем с простого проекта, чтобы увидеть, как работает контекст API. Откройте свой терминал и запустите «NPM Unlight-rage-Adv-app», а затем, когда он установлен, создайте новое приложение, набрав «Create-ract-App-App-AP-API». После создания проекта введите «CD Context-API», а затем «NPM Start». Вы должны быть в состоянии получить доступ к Action App на http://localhost: 3000/и см. Стандартное содержимое приложения RACT, когда оно создано. Мы будем чистить файл app.js немного, так как нам не нужно все там. Вот как ваш файл App.js должен выглядеть в данный момент:
import React, { Component } from 'react'; import './App.css'; class App extends Component { render() { return (); } } export default App;
В каталоге «SRC» создайте новые компоненты папки «», а затем внутри, создайте файл header.js. В Twitter пользователи могут выбрать свою собственную цветовую схему, поэтому мы построим простой заголовок, где мы предоставим конфигурацию для темы. Во-первых, добавьте немного фиктивного контента в файле header.js, а также создайте файл header.css с небольшим количеством стайлинга.
Header.js.
import React, { Component } from 'react'; import './Header.css'; const Header = props => { return () } export default Header; Here is our awesome logo
Header.css.
header { width: 100%; height: 80px; } .orange-theme { background-color: #FF851B; } .teal-theme { background-color: #39CCCC; } .green-theme { background-color: #2ECC40; } .header-container { display: flex; justify-content: space-between; align-items: center; width: 70%; height: 100%; margin: 0 auto; } nav ul { display: flex; list-style: none; } nav ul li { margin: 0 20px; }
Наша тема по умолчанию будет оранжевым, но у нас также есть чирок и зеленые темы. Конечно, мы также должны теперь импортировать header.js и добавить его в наш компонент приложения.
import React, { Component } from 'react'; import './App.css'; import Header from './components/Header'; class App extends Component { render() { return (); } } export default App;
После добавления всего этого кода вы теперь должны иметь оранжевый заголовок с текстом логотипа и навигации.
Я знаю, ничего особенного, но мы здесь не здесь, чтобы построить красивый заголовок, нам нужно создать еще два файла, первый это config.js. Мы поставьте там объект с выбранной пользователем темой. Обычно конфигурация, как это будет выбрано с сервера, но с целью этого учебника этого должно быть достаточно. В config.js просто напишите:
export default { userTheme: 'teal' }
Второй файл – это theContext.js, в котором мы создадим новый контекст. Создайте новую папку для него в каталоге/SRC, называемом «контекстом», а после этого создайте наш файл TheContext.js.
Сейчас самое время для начала начать. В TEMECONTEXT.JS, создайте и экспортируйте новую константу, которая удержит контекст и передает объект с помощью свойств пользователя, который будет по умолчанию оранжевый, если тема не предусмотрена.
import React from 'react' export const ThemeContext = React.createContext({userTheme: 'orange'})
Следующее, что нужно сделать, это использовать провайдер, чтобы сделать эту тему, доступную для дочерних компонентов. В app.js мы должны импортировать контекст, а затем обернуть верхний div с themecontext.provider. Нам также нужно импортировать наш userconfig и передавать его как ценность для провайдера. Вот что должно выглядеть ваш файл App.js:
import React, { Component } from 'react'; import './App.css'; import Header from './components/Header'; import userConfig from './config.js'; import { ThemeContext } from './context/ThemeContext'; class App extends Component { render() { return (); } } export default App;
Импортируйте TheContext в Header.js, чтобы мы могли использовать его, чтобы получить наш пользовательский конфиг.
import { ThemeContext } from '../context/ThemeContext'; const Header = props => { return (...other content here ) }
Важным фактом, чтобы помнить, что потребитель требует функции в детстве, которая возвращает JSX. Значение, которое мы прошли в провайдере, доступно в качестве первого параметра. Мы будем использовать деструктурию, чтобы получить нашу свойство пользователя и использовать его для класса заголовка.
import { ThemeContext } from '../context/ThemeContext'; const Header = props => { return ({({ userTheme }) => ( ) }...other content here )}
Если вы сохраните файл header.js, вы должны увидеть, что цвет фона заголовка изменился на Teal. Вот как вы предоставили значение от родителя к дочернему компоненту. Я знаю, что в этом случае заголовок является прямым ребенком приложения, и вы могли бы просто передать его как опоры, но это просто чтобы показать, как работает контекстные API. Если вы удалите свойство пользовательской сети с конфигурации, то фоном изменится на оранжевый, так как мы предоставили тему по умолчанию при создании контекста.
Контекст API – очень интересная и полезная функция, которая может помочь вам избежать прохождения реквизитов через многие компоненты. Были даже предложения, которые теперь, когда API контекста больше не экспериментал, он заменит необходимость в библиотеках государственных управлений, таких как Redux.
Я лично думаю, что государственные библиотеки управления все равно останутся важной частью приложений по реагированию. В отличие от контекста API, государственные библиотеки управления предлагают продукты по производству решений, которые помогают рассуждать и поддерживать поток приложения и о том, как компоненты взаимодействуют друг с другом.
Мы можем сохранить наши компоненты Sceaner, имея отдельные проблемы и централизованный магазин с состоянием. Или, может быть, давайте просто создадим государственную библиотеку управления на основе контекста API? Мы увидим, что принесет будущее, так как трудно прогнозировать, что может произойти когда-либо изменения тенденций и технологий.