Mixins em Vue.js
Mixins permitem reutilizar funcionalidade entre componentes, de forma semelhante à herança. Um mixin pode conter propriedades, métodos e outras opções do Vue. Quando um componente usa um mixin, seus métodos e propriedades são incorporados ao componente.
Exemplo de Componentes Sem Mixins
Considere o exemplo a seguir com dois componentes:
<!DOCTYPE html>
<html>
<head>
<title>Componentes Vue.js</title>
<meta charset="utf-8" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<light></light>
<enabled></enabled>
</div>
<script>
const app = Vue.createApp({});
app.component('light', {
template: `<div>
<h3>{{header}}</h3>
<button v-on:click="toggle" v-show="state">{{on}}</button>
<button v-on:click="toggle" v-show="!state">{{off}}</button>
</div>`,
data() {
return { state: true, on: "ON", off: "OFF" };
},
methods: {
toggle() {
this.state = !this.state;
}
},
computed: {
header() {
return this.state ? "Luz ligada" : "Luz desligada";
}
}
});
app.component('enabled', {
template: `<div>
Estado: {{ state ? "acesso liberado" : "acesso bloqueado" }}
<button v-on:click="toggle" v-show="state">{{on}}</button>
<button v-on:click="toggle" v-show="!state">{{off}}</button>
</div>`,
data() {
return { state: true, on: "ON", off: "OFF" };
},
methods: {
toggle() {
this.state = !this.state;
}
}
});
app.mount('#app');
</script>
</body>
</html>
Os dois componentes possuem funcionalidade semelhante, e esse código pode ser extraído para um mixin.

Refatoração com Mixins
Para refatorar o código acima, podemos criar um mixin que contém a lógica compartilhada entre os componentes.
<div id="app">
<light></light>
<enabled></enabled>
</div>
<script>
const toggleMixin = {
data() {
return { state: true, on: "ON", off: "OFF" };
},
methods: {
toggle() {
this.state = !this.state;
}
}
};
const app = Vue.createApp({});
app.component('light', {
template: `<div>
<h3>{{header}}</h3>
<button v-on:click="toggle" v-show="state">{{on}}</button>
<button v-on:click="toggle" v-show="!state">{{off}}</button>
</div>`,
mixins: [toggleMixin],
computed: {
header() {
return this.state ? "Luz ligada" : "Luz desligada";
}
}
});
app.component('enabled', {
template: `<div>
Estado: {{ state ? "acesso liberado" : "acesso bloqueado" }}
<button v-on:click="toggle" v-show="state">{{on}}</button>
<button v-on:click="toggle" v-show="!state">{{off}}</button>
</div>`,
mixins: [toggleMixin]
});
app.mount('#app');
</script>
O mixin toggleMixin
toggle()
mixins
Se um mixin e um componente definirem propriedades ou métodos com o mesmo nome, a implementação do componente terá prioridade e substituirá a do mixin.
Mixins Globais
No Vue.js, mixins podem ser definidos globalmente e aplicados a todos os componentes da aplicação. O método mixin()
<!DOCTYPE html>
<html>
<head>
<title>Componentes Vue.js</title>
<meta charset="utf-8" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<message></message>
</div>
<script>
const app = Vue.createApp({});
app.component('message', {
template: `<h2>Hello</h2>`
});
app.mixin({
created() {
console.log("Mixin global foi criado");
}
});
app.mount('#app');
</script>
</body>
</html>
Neste caso, um mixin global é definido e o hook created()
message

Resumo
Mixins permitem compartilhar lógica entre componentes no Vue.
Um mixin pode conter
,data()
,methods
e outros recursos do Vue.computed
O mixin é adicionado ao componente usando
.mixins: [mixinName]
Se um mixin e um componente tiverem métodos ou propriedades com o mesmo nome, o do componente tem prioridade.
Mixins globais podem ser aplicados a todos os componentes da aplicação com
.app.mixin()