Когда я начал использовать Vue.js в качестве интерфейсной среды, мне сразу понравился простой способ настройки компонентов и управления ими. Использование отдельных файловых компонентов позволяет мне сосредоточиться на всех аспектах, касающихся того, как я их создаю: мне просто нужно поместить 3 тега в файл .vue, и я могу начать формировать как визуальный аспект, так и всю логику самого компонента. Говоря о стилях, первое, что вам сообщает официальный документ, это как стилизовать компонент: просто вставьте тег стиля (обычно в конце файла), и все готово. Но когда вы идете дальше и начинаете создавать сложные интерфейсы, вам сразу же нужно выполнять стилизацию, выходящую за рамки простой композиции классов CSS.
Итак, во время своего путешествия я обнаружил несколько способов выполнения динамической стилизации, и эта статья призван стать кратким справочником для людей, которые впервые столкнулись с этой потребностью.
Чтобы показать вам различные методы, я буду использовать очень простой компонент кнопки, который должен использовать определенное значение цвета фона, если логическое свойство true (хорошо, может быть, это слишком просто, но вы быстро поймете концепции).
Начнем с кода компонента:
<template> <button class="my-button"> {{ text }} </button> </template>
<script> export default { props: { text: { type: String, default: "" }, isWarning: { type: Boolean, default: false } } } </script>
<style lang="scss"> .my-button { padding: 10px 20px; border-radius: 8px; border: 0; } </style>
и мы вызываем компонент так:
<my-button text="Attention!" :is-warning="true"/>
Обвязка стиля №1
Это более простое решение, просто используйте привязку стиля Vue.js и измените свойство background-color CSS:
<template>
<button
class="my-button"
:style="{'background-color': isWarning ? '#FC4': '#CCC'}"
>
{{ text }}
</button>
</template>
# 2 привязка класса
С привязкой класса мы добавляем определенный класс только в том случае, если реквизит isWarning
верен:
<template>
<button
:class="['my-button', {'warning': isWarning}]"
>
{{ text }}
</button>
</template>
и ниже в теге стиля:
<style lang="scss">
.my-button {
padding: 10px 20px;
border-radius: 8px;
border: 0;
&.warning {
background-color: #FC4;
}
}
</style>
#3 Вычисляемый класс
С помощью этого метода мы просто определяем classes
вычисляемое значение, которое возвращает строку имен классов CSS на основе значения свойства компонента isWarning
:
computed: { classes () { if (this.isWarning) { return 'my-button warning'; }
return 'my-button'; } }
затем мы используем привязку класса, которую мы использовали выше, передавая только вычисленное значение:
<template>
<button :class="classes">
{{ text }}
</button>
</template>
#4 Вычисляемый стиль с переменной css
Ааа, эта техника мне больше всего нравится 😀 . Это вариант предыдущего, но мы используем привязку стиля и переменную css для изменения цвета фона.
Давайте начнем использовать переменную css для свойства background-color
:
<style lang="scss">
.my-button {
padding: 10px 20px;
border-radius: 8px;
border: 0;
background-color: var(--button-bg-color)
}
</style>
затем мы добавляем вычисляемое значение, которое определяет окончательное значение нашей переменной --button-bg-color
:
computed: {
cssVars () {
return {
'--button-bg-color': this.isWarning ? '#FC4' : '#CCC'
}
}
}
и, наконец, мы добавляем привязку стиля к тегу кнопки:
<template>
<button
class="my-button"
:style="cssVars"
>
{{ text }}
</button>
</template>
#5 Стилизованные компоненты
Styled-components — известная библиотека CSS-in-JS, используемая, в частности, разработчиками React… и вы также можете использовать ее с Vue.js 😉. Пакет можно найти здесь, обратите внимание, что он совместим только с Vue 2.x.
Установите пакет (используя пряжу в качестве менеджера пакетов):
yarn add vue-styled-components
Из-за простоты компонента мы определяем его внутри родительского компонента внутри тега script
. Сначала мы должны импортировать библиотеку:
import styled from 'vue-styled-components';
затем мы определяем компонент (стилизованную кнопку) и его свойство isWarning
:
const btnProps = {
isWarning: Boolean
}
const MyButton = styled('button', btnProps)`
padding: 10px 20px;
border-radius: 8px;
border: 0;
background-color: ${props => props.isWarning ? '#FC4' : '#CCC'};
`;
Обратите внимание на background-color: ${props => props.isWarning ? '#FC4' : '#CCC'};
, здесь мы говорим библиотеке изменить свойство CSS на основе значения свойства isWarning
.
Последний шаг — зарегистрировать только что созданный компонент и использовать его внутри шаблона:
.... components: { MyButton } ...
<my-button :is-warning="true"> Attention! </my-button>
Помимо библиотеки styled-components, существуют и другие библиотеки CSS-in-JS, которые можно использовать для Vue.js, например, Emotion через пакет vue-emotion.
Вот и все, надеюсь, эта статья окажется вам полезной. Если вы знаете другие методы, не стесняйтесь написать мне, и я обновлю статью!
Спасибо за прочтение!