Reputation: 73
I'm a Beginner in Vuetify
.
I want to create a button on my website like this:
<v-btn class="v-btn white--text mx-1 px-6" elevation="2" x-small rounded color="#BB86FC">text</v-btn>
also am adding <v-hover>
tag to my code:
<v-hover>
<v-btn class="white--text mx-1 px-6" elevation="2" x-small rounded color="#BB86FC">text</v-btn>
</v-hover>
and adding style in my CSS
:
.v-btn:hover:
but is not working.
How can I give it a different style
to change the background color
so when hovering over the button, the color changes to "red"?
Upvotes: 7
Views: 14870
Reputation: 9412
Let's go a little bit deeper..
The v-hover component provides a simple interface for handling hover states for any component. It is a renderless component that uses the default slot to provide scoped access to its internal model; as well as mouse event listeners to modify it.
As discussed in Render Scope, slot content does not have access to state in the child component. However, there are cases where it could be useful if a slot's content can make use of data from both the parent scope and the child scope. To achieve that, we need a way for the child to pass data to a slot when rendering it. In fact, we can do exactly that - we can pass attributes to a slot outlet just like passing props to a component.
One implementation example using Vuetify 3 and Vue.js 3 would be like so:
<v-hover v-slot="{ isHovering, props }">
<v-btn v-bind="props" :color="isHovering ? red : blue" text="cancel" />
</v-hover>
The way v-hover
works is by binding the props to the component it needs to listen to, so that it knows when to generate the hover effect. The v-slot
is providing a two way binding between the child and parent component through the slot mechanism. So whenever the button is hovered (an event occurs) it communicates with v-hover
through the props
, making v-hover
react by changing the state of isHovering
and thus changing the color of the button.
Upvotes: 3
Reputation: 176
Also for v-btn you have just directive color, so you can use code like Majed Badawi wrote but change style to :color="hover ? 'red' : 'blue'"
Upvotes: 5
Reputation: 28434
You can add v-slot
on v-hover
and use it in the style-binding
of the button as follows:
new Vue({ el:"#app", vuetify: new Vuetify() });
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.js"></script><link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/[email protected]/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.min.css" rel="stylesheet">
<v-app id="app">
<v-hover v-slot="{ hover }">
<v-btn
class="v-btn white--text mx-1 px-6"
elevation="2"
x-small
rounded
:style="{ 'background-color': hover ? 'red' : '#BB86FC' }"
>text</v-btn>
</v-hover>
</v-app>
Upvotes: 9