#javascript #css #reactjs #sass
#javascript #css #reactjs #sass
Вопрос:
У меня есть эта переменная состояния:
this.state = {
theme: "light"
}
Это состояние добавляется к имени класса divs, поэтому оно становится
<div class name=`app ${this.state.theme}`>
У меня также есть три файла scss: App.scss, LightTheme.scss и DarkTheme.scss. App.scss должен импортировать один из файлов scss темы, потому что у них есть некоторые переменные цвета, которые составляют тему.
Я попытался использовать оператор if scss, но обнаружил, что scss нельзя использовать для проверки, содержит ли элемент определенное имя класса или нет.
Импорт файлов темы с помощью JavaScript также не работает, поскольку app.scss будет иметь неопределенные переменные.
Есть мысли?
Ответ №1:
Вы можете импортировать три файла и добавить theme
класс в самый первый div внутри вашего App.js
, что-то вроде этого:
function App() {
return (
<div className={`App theme-${this.state.theme}`}>
...
</div>
);
}
Вы бы импортировали все три scss
файла, а затем внутри, скажем, DarkTheme.scss, вы можете сделать следующее:
// ThemeDark.scss
.theme-dark {
h1 {
color: white;
}
.navigation {
background-color: darkblue;
}
}
// ThemeLight.scss
.theme-light {
h1 {
color: black;
}
.navigation {
background-color: lightgray;
}
}
Et cetera. В моем случае я всегда использую облегченную версию, поскольку по умолчанию всегда импортируется, но, возможно, было бы неплохо сделать это так, как вы предлагаете, и иметь файл css, нейтральный к теме:
// App.scss
h1 {
font-size: 2em;
}
.navigation {
position: absolute;
}
Комментарии:
1. Все мои стили находятся в app.scss . Файлы темы содержат только переменные цвета. Я думал о том, чтобы сделать это так, как вы предложили, но позже я добавлю больше файлов scss для разных компонентов, поэтому в конечном итоге я буду писать цвета снова и снова.
2. Да, действительно много повторений. Вы могли бы использовать переменные CSS или темы SASS , последние статьи кажутся интересным подходом, поскольку вам нужно будет определить только один файл. В моем случае я обычно определяю файл colors.scss, чтобы я мог сделать $ gray_dark или $ gray_50 и т.д.
Ответ №2:
Разве вы не можете импортировать App.scss
в to LightTheme.scss
, а также в to DarkTheme.scss
в качестве первой строки?
@import "../../App.scss"; /*add path to App.scss*/
Затем вы можете вызвать либо LightTheme.scss
или DarkTheme.scss
, который должен работать так, как вы ожидаете.
Редактировать
«Все мои стили находятся в app.scss. Файлы темы содержат только переменные цвета. «
-
Создайте новый файл light-theme.scss
-
Добавьте в него эти 2 строки.
@import "../../LightTheme.scss"; /*variables*/ @import "../../App.scss"; /*styles*/
-
Создайте еще один новый файл dark-theme.scss
-
Добавьте в него эти 2 строки.
@import "../../DarkTheme.scss"; /*variables*/ @import "../../App.scss"; /*styles*/
Теперь просто вызовите light-theme.scss или dark-theme.scss, как вы планировали.
Комментарии:
1. Я пытался это сделать, но оператор import находится за пределами
class App extends Component {...}
, поэтому он не знаетtheme
состояния.2. Я только что добавил еще один подход, который поможет вам решить эту проблему. Проверьте раздел редактирования.