Vue Tips: Dynamic CSS with Vue Reactive Variables
📣 Sponsor
If you use Vue, you might be used to having to apply different classes to tags based on the logic in your code. That’s because we might want to reactively update an elements class based on when certain conditions. For example, suppose if a variable check
is set to true, we want a div
to show as red, but otherwise it should be blue. For such use cases, it’s common to see the following code:
<div :class="check === true ? 'red' : 'blue'">
Hello World
</div>
Did you know, however, that you can actually put Vue reactive variables straight in your CSS with Vue 3? We have to use the composition API (read more: difference between composition and options API), but once we do, we can avoid the code below and put our variable straight in our CSS.
Let’s look at a simple example. Suppose we have the following script in our Vue template:
<script setup>
import { ref } from 'vue'
const check = true;
let color = ref('#ff0000');
if(check == true) {
color.value = '#0000ff';
}
</script>
<input value="Hello World" />
Simple, right? If check
is true
, the color
variable is ‘#0000ff
’. Otherwise it’s ‘#ff0000
’. In our CSS, with Vue 3, we can now directly reference color
by using v-bind
:
<style>
input {
color: v-bind(color)
}
</style>
Now if color
updates reactively, the color
of input will change to whatever the color
variable is set to. That means you can avoid some awkward logic in your HTML tags, and start using Javascript variables straight in your CSS - and I think that’s pretty cool.
More Tips and Tricks for Vue
- Vue Tips: Dynamic CSS with Vue Reactive Variables
- Vue Tips: Optimize your Vue Apps with v-once and v-memo
- Creating a Websocket Server in Vue.js
- How to set default inject/provide values in Vue
- The Difference Between the Composition API and Options API in Vue
- Creating a Reusable Tab Component in Vue
- How Provide and Inject work in Vue
- v-show vs v-if: Conditional Rendering in Vue
- A Guide to Understanding Vue Lifecycle Hooks
- How Vue Components Work