Я строю реакцию собственного применения в свободное время. Я пишу это, чтобы показать, насколько я счастлив со структурой, которую я создал к тематическим компонентам.
Это личный проект, поэтому у меня нет дизайнеров. Это все сам. Так что цвета всегда дают мне головные боли. Это самая медленная часть развития.
Также без надлежащей организации собственное применение реагирования может превратиться в хаос. Так что темы пригодится.
Выбирая цвета
Чтобы облегчить боль, которую я использую Этот сайт генерировать цвета.
Прекрасно, насколько красивые цвета выскакиваются из удара пробела.
Для этого учебника я выбираю два различных тем. Каждый с текстом, вторичным текстом, легким текстом, фоном и первичными цветами.
Это зависит от вас, сколько цветов использовать. Для моего проекта это то, что я использую. Наверняка, поскольку приложение растет, я вернусь к охлаждениям, чтобы выбрать больше цветов для моей палитры.
Прежде чем начать
В этом руководстве мы будем использовать 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. Реагистрационная тема , Например.
Я не использовал ни одного из тех, потому что я думал, что могу многому научиться, создавая свою собственную тему архитектуру и свои собственные компоненты. И да! Это сработало. Я многому научился от этого.
Это не только применимо для реагирования на родных. Некоторый небольшой рефакторинг, вы сможете запустить его с реагированием в Интернете.
Если у вас есть какие-либо предложения, нашли Ошибка В тексте или просто хотите поделиться своими мыслями, пожалуйста, оставьте комментарий. Я буду рад ответить.
Спасибо за чтение!
Первоначально опубликовано на среднем и адаптирован для кодамента.