Сегодня мы собираемся использовать ResolveConfig от Tailwind, чтобы написать файл JavaScript, который мы можем использовать с React Context API Чтобы получить доступ к значениям из любой точки приложения.
Мы создадим небольшое приложение и покажем его в действии, переопределив некоторые стили из React Select библиотека.
Настройка
Мы идем с основным Создать приложение React шаблон. Давайте настроим это и установим зависимости на сегодня.
# Create app npx create-react-app tailwind-theme-example # Change into folder cd tailwind-theme-example # Install dependencies yarn add tailwindcss \ react-select \ prettier # Create a bin folder for us to write our JS generation script mkdir bin touch bin/generate-tailwind-theme # Add execution permissions chmod u+x bin/generate-tailwind-theme
Конфигурация ветра
Мы хотим иметь tailwind.config.js Файл, который можно использовать для расширения по умолчанию. Мы не будем делать с этим слишком много сегодня, но давайте создадим его для использования без нашего сценария позже.
# Setup tailwind config file npx tailwindcss init
Это создаст tailwind.config.js Файл в корневом каталоге, который выглядит так:
// tailwind.config.js
module.exports = {
theme: {},
variants: {},
plugins: [],
}
Давайте теперь напишем наш скрипт, который будет ссылаться на этот файл.
Обновление нашего скрипта
Внутри Bin/Generate-TailWind-Theme , обновить файл, чтобы иметь следующее:
#!/usr/bin/env node
const fs = require("fs")
const resolveConfig = require("tailwindcss/resolveConfig")
const prettier = require("prettier")
const path = require("path")
// bring in the Tailwind config
const tailwindConfig = require("../tailwind.config.js")
const { theme } = resolveConfig(tailwindConfig)
const themeStr = JSON.stringify(theme)
const js = `
const theme = ${themeStr}
export default theme
`
try {
// write the file to src/theme.js after
// having prettier format the string for us
fs.writeFileSync(
path.resolve(process.cwd(), "./src/theme.js"),
prettier.format(js, { parser: "babel" }),
"utf-8"
)
} catch (err) {
// uh-oh, something happened here!
console.log(err.message)
}
Здесь мы выполняем эти шаги:
- Используйте
ResolveConfigот Tailwind до объединения нашей конфигурации и их конфигурации по умолчанию. Мы разрушаемтемаиз результата. - Строка
темаЗначение и интерполируйте его в строкеJS. Эта строка действительна JavaScript. - Написание этого файла в
src/theme.jsПосле того, как наша красивая библиотека форматирует это.
Теперь мы можем запустить это, используя Bin/Generate-TailWind-Theme Анкет Если это не сработает, вам может потребоваться проверить, что у вас есть правильные разрешения, а Шебанг (#!) Ссылка на установку узла. Если это не сработает, не стесняйтесь бежать Node Bin/Generate-TailWind-Theme и посмотрите, что произойдет.
Тема вывода
После успеха короткий взгляд на наш src/theme.js Файл должен выглядеть следующим образом:
const theme = {
screens: { sm: "640px", md: "768px", lg: "1024px", xl: "1280px" },
colors: {
transparent: "transparent",
current: "currentColor",
black: "#000",
white: "#fff",
gray: {
"100": "#f7fafc",
"200": "#edf2f7",
"300": "#e2e8f0",
"400": "#cbd5e0",
"500": "#a0aec0",
"600": "#718096",
"700": "#4a5568",
"800": "#2d3748",
"900": "#1a202c",
},
// ... the rest has been omitted for brevity
},
// ... the rest has been omitted for brevity
}
export default theme
Потрясающий! Теперь у нас есть конфигурация темы, которую мы можем использовать в контексте React.
Настройка поставщика для нашего приложения
Обновите src/app.jsx Файл, чтобы выглядеть следующим образом:
import React, { createContext } from "react"
import theme from "./theme"
import { Select } from "./Select"
import "./App.css"
export const ThemeContext = createContext(theme)
function App() {
const [select, setSelect] = React.useState()
return (
)
}
export default App
Themecontext что мы создали с помощью CreateContext позволит теме быть доступной с UseContext зацепите на протяжении всего нашего приложения!
На данный момент наше приложение не будет запущено (мы не создали наш файл select ).
Мы собираемся написать файл адаптера для нашего Выберите составная часть.
Создайте адаптер выбора
Добавить новый Выберите Файл компонента.
touch src/Select.jsx
Теперь внутри это src/select.jsx Файл, добавьте следующее:
import React from "react"
import BaseSelect from "react-select"
import { ThemeContext } from "./App"
export const Select = props => {
const theme = React.useContext(ThemeContext)
const customStyles = {
control: (provided, state) => ({
...provided,
zIndex: theme.zIndex["10"],
fontFamily: theme.fontFamily.sans.join(","),
fontSize: theme.fontSize.base,
borderColor: state.isFocused
? theme.colors.blue["500"]
: theme.colors.gray["300"],
borderWidth: theme.borderWidth["2"],
outline: "none",
boxShadow: "none",
"&:hover": {
borderColor: state.isFocused
? theme.colors.blue["500"]
: theme.colors.gray["500"],
},
}),
menu: provided => ({
...provided,
fontFamily: theme.fontFamily.sans.join(","),
fontSize: theme.fontSize["text-base"],
}),
option: (provided, state) => ({
...provided,
backgroundColor: state.isSelected
? theme.colors.blue["500"]
: theme.colors.white,
"&:hover": {
...provided["&:hover"],
backgroundColor: theme.colors.blue["700"],
color: theme.colors.white,
},
}),
}
return
}
В этом файле мы экспортируем BASESELECT С некоторыми стилями по умолчанию, которые поступают из наших тема Анкет
Эти ценности темы поступают из Theme.js объект, который добавил в наш контекст! Это возможно на линии const.usecontext (hemecontext) Где мы установили тему, чтобы получить из нашего контекста, мы установили в App.js Анкет
Здесь нужно отметить, что у семьи шрифтов есть ценность theme.fontfamily.sans.join ("") Анкет В основном, Fontfamily Ключевые значения – это массив, поэтому он будет действительным для Фонт-семья Свойство CSS, мы хотим присоединиться к этому массиву, чтобы иметь место между каждым значением т.е. ['Open Sans', 'sans-serif'] В качестве примера станет Open Sans, Sans-Serif Анкет
Этот стиль не идеален. Это всего лишь некоторые стили, с которыми я играл этим утром, но они иллюстрируют смысл.
Запуск приложения
Давайте подведем наше приложение и пойдем нормально:
yarn start
Теперь вы можете увидеть, что у нас применяется стили темы Tailwind!
Теперь мы можем увидеть эти изменения в действии. Если мы вернемся к нашему src/select.jsx Подайте и замените все экземпляры Theme.colors.blue с Theme.colors.teal , теперь вы увидите Тил!
Поздравляю, теперь у вас есть доступ к ценностям темы Tailwind в вашем приложении React!
Ресурсы и дальнейшее чтение
- Заполненный проект на GitHub
- React Select – пользовательские стили
- Tailwind – ссылка на JavaScript
- React Context API
Изображение предоставлено: Ибрагим Асад
Первоначально опубликовано на моем блог . Следуйте за мной в Твиттере за более скрытыми драгоценными камнями @dennisokeeffe92 .
Оригинал: “https://dev.to/okeeffed/how-to-use-your-tailwind-theme-anywhere-throughout-your-react-app-2a6i”