Я строю реакцию собственного применения в свободное время. Я пишу это, чтобы показать, насколько я счастлив со структурой, которую я создал к тематическим компонентам.
Это личный проект, поэтому у меня нет дизайнеров. Это все сам. Так что цвета всегда дают мне головные боли. Это самая медленная часть развития.
Также без надлежащей организации собственное применение реагирования может превратиться в хаос. Так что темы пригодится.
Выбирая цвета
Чтобы облегчить боль, которую я использую Этот сайт генерировать цвета.
Прекрасно, насколько красивые цвета выскакиваются из удара пробела.
Для этого учебника я выбираю два различных тем. Каждый с текстом, вторичным текстом, легким текстом, фоном и первичными цветами.
Это зависит от вас, сколько цветов использовать. Для моего проекта это то, что я использую. Наверняка, поскольку приложение растет, я вернусь к охлаждениям, чтобы выбрать больше цветов для моей палитры.
Прежде чем начать
В этом руководстве мы будем использовать React 16.3, React Context API и Пересчитать Отказ Мы также создадим некоторые HOCS WED для повторных целей.
Если вы не знаете, что компенсируется, прочитайте Строительные HOCS с компенсацией Пост на среде, который объясняет, что это такое и как его использовать.
Если вы не знакомы с функцией контекста RACT, прочитайте Это первым.
Еще одна важная информация касается структуры кода. Все мои компоненты используют компенсируют для чего-то. Так что гипотетический MyComponent
Структура каталогов компонента будет:
┌─ MyComponent/ ├─── MyComponent.js └─── index.js
Mycomponent.js
Файл – сам компонент (функциональный компонент). index.js
Файл – это то, где рекомендуется компенсировать все его HOC и экспортирует расширенный компонент.
Настройка темы
Нам нужно установить место для проведения наших тем. В моем проекте у меня есть файл под названием Themes.js
Отказ Он проводит мои темы, а также экспортирует мой поставщик и потребительский контекст.
import React from 'react'; const themes = { beans: { text: '#191923', secondaryText: '#818187', lightText: '#FBFEF9', bg: '#FBFEF9', primary: '#FF206E', }, chaid: { text: '#222823', secondaryText: '#A7A2A9', lightText: '#F4F7F5', bg: '#F4F7F5', primary: '#2274A5', }, }; const { Provider, Consumer } = React.createContext(themes.chaid); export { Provider, Consumer, themes, };
Обратите внимание, что я устанавливаю весь объект темы в качестве значения контекста. Это облегчит вещи в будущем.
Упаковка с нашим провайдером
Теперь мы создадим компонент, который обернут любые дети, пройденные с провайдером, полученным из theme.js
файл.
// AppContainer/AppContainer.js // @flow import React from 'react'; import { Provider as ThemeProvider, themes } from '../../theme'; type Props = { theme: string, children: any }; const AppContainer = ({ theme, children, }: Props) => ({children} ); export default AppContainer;
// AppContainer/index.js // @flow import { compose, withState } from 'recompose'; import AppContainer from './AppContainer'; const EnhancedAppContainer = compose( withState('theme', 'setTheme', 'chaid'), )(AppContainer); export default EnhancedAppContainer;
Обратите внимание, что я не использую SetTheMee
от компенсации. У меня пока нет случая использования. Я установил тему по умолчанию в index.js
Файл и используйте его. Но в приложении не сложно создавать обработчик для переключения темати. Поскольку в центре внимания этого учебника – показать, как создавать тематические компоненты, я не буду охватывать это.
Кроме того, этот подход позволяет нам тестировать темы, просто изменив тему по умолчанию на этом компонент.
Используя контейнер
Наш контейнер обернет все наше приложение.
// App.js import React from 'react'; import { NativeRouter } from 'react-router-native'; import { Scenes } from '../../scenes'; import AppContainer from '../AppContainer'; class App extends React.Component { render() { return (); } } export default App;
Это корневой компонент, который реагирует на родных регистров (в моем случае EXPO). Другой файл заботится об этом.
Теперь интересная часть.
Настройка требуемых HOCS
Как время написания, компенсируйте было в версии 0.27.1. В Исходный код Есть ИзRenderProops
файл. Это тоже Документировано Отказ Но этот HOC еще не был выпущен. Так что я позаимствовал freenderprops.js
Файл и создал HOC в моем источнике в SRC/HOCS
каталог.
Я не изобретаю колесо здесь. Я поддерживаю самому, что-то рекомендую будет поддерживать в будущем. После того, как реклама поддерживает его, я могу удалить этот HOC.
Этот HOC извлекает рендеринг реквизиты из компонента и отображает его как обычные реквизиты. React Context Consumer получает значение контекста посредством рендеринга. Этот HOC будет полезен для создания другого HOC. Я назвал это Стема.js
и сохранил это в том же SRC/HOCS
каталог. Вот что это делает:
import { compose, defaultProps, setDisplayName } from 'recompose'; import fromRenderProps from './fromRenderProps'; import { Consumer as ThemeConsumer } from '../theme'; export default compose( setDisplayName('withTheme'), defaultProps({ theme: {}, }), fromRenderProps(ThemeConsumer, theme => ({ theme })), );
Это просто отображает тему рендеринга от потребителя к нормальным реквизитам.
Используя наш новый HOC
Первый хороший пример – вид. У меня есть две версии: тему и непечатанный Отказ Первый хорошо используется в качестве контейнеров, где следует использовать цвет фона вашей темы. Другой может быть использован в макетах.
// View/View.js // @flow import React from 'react'; import { View as RNView } from 'react-native'; type ViewProps = { children: React.ReactNode, }; const View = ({ children, ...props }: ViewProps) => ({children} ); export default View;
// View/ThemedView.js // @flow import React from 'react'; import { View as RNView, StyleSheet } from 'react-native'; type Props = { children: React.ReactNode, style: ?Object, }; const getStyles = props => StyleSheet.create({ view: { backgroundColor: props.backgroundColor, }, }); const ThemedView = ({ children, style, ...props }: Props) => { const styles = getStyles(props); return ({children} ); }; export default ThemedView;
// View/index.js import { compose, withProps, branch, renderComponent } from 'recompose'; import View from './View'; import ThemedView from './ThemedView'; import { withTheme } from '../../../hocs'; const EnhancedView = compose( withTheme, branch( props => props.themed, compose( withProps(props => ({ backgroundColor: props.theme.bg, })), renderComponent(ThemedView), ), ), )(View); export default EnhancedView;
В index.js
Файл мы:
- Используйте нашу
с этим
HOC как первый по порядку; - (Необязательно) Определите некоторые реквизиты с хорошими именами для использования внутри наших компонентов;
- (Необязательно) Определите ветку, чтобы сделать
Тематический вид
ЕслиТематические
предпримет существует. По умолчанию Olk – это упакованный компонент, согласно рекомендую Документация Отказ
Если вы хотите пропустить эти два дополнительных шага, вы можете просто использовать Тема
опоры внутри вашего компонента.
// View/ThemedView.js // @flow import React from 'react'; import { View as RNView } from 'react-native'; type Props = { children: React.ReactNode, theme: Object, style: ?Object, }; const ThemedView = ({ children, style, theme, ...props }: Props) => ({children} ); export default ThemedView;
Использование нашего тематического компонента
Чтобы проверить его, я определил тему с двумя основными цветами:
const themes = { chaid: { text: 'white', bg: 'steelblue', }, }; // ...
Теперь тесты.
Рассмотрим как rnview и rntext the Реагистративно
Компоненты пакета. Просмотр и текст из моего исходного кода.
- По умолчанию реагируют родной текст и просмотр
Hey Hey!
- По умолчанию реагируют родной текст и наш пользовательский вид непечатанный
Hey Hey!
Тот же результат, что и выше. Оказывает простое реагированное мнение.
- Наш пользовательский тематический вид и пользовательский тематический текст.
Hey Hey!
Намного лучше.
Пользовательский тематический текстовый компонент определяется с использованием той же методики, описанных в вышеуказанных разделах.
Обертывание
Есть несколько пакетов для тематических действий для реагирования народа на NPM. Реагистрационная тема , Например.
Я не использовал ни одного из тех, потому что я думал, что могу многому научиться, создавая свою собственную тему архитектуру и свои собственные компоненты. И да! Это сработало. Я многому научился от этого.
Это не только применимо для реагирования на родных. Некоторый небольшой рефакторинг, вы сможете запустить его с реагированием в Интернете.
Если у вас есть какие-либо предложения, нашли Ошибка В тексте или просто хотите поделиться своими мыслями, пожалуйста, оставьте комментарий. Я буду рад ответить.
Спасибо за чтение!
Первоначально опубликовано на среднем и адаптирован для кодамента.