Propriété mixins de Vue3
Dans Vue.js,mixinsest un moyen flexible de distribuer des fonctionnalités réutilisables dans les composants Vue. Grâce àmixinsvous pouvez encapsuler ensemble des options, de la logique ou des hooks de cycle de vie partagés par plusieurs composants, puis intégrer ces fonctionnalités dans les composants qui en ont besoin. Cela évite la duplication de code et améliore la maintenabilité du code.
Dans Vue 3,mixinsest encore un outil très utile. Bien que la Composition API offre une manière plus flexible de réutiliser des fonctionnalités,mixinsreste un choix simple et efficace dans certains scénarios.
Comment utiliser les mixins ?
1. Créer un mixin
Tout d'abord, vous devez créer unmixinobjet. Cet objet peut contenirdata、methods、computed、watchainsi que des options comme les hooks de cycle de vie.
Exemple
export const myMixin = {
data() {
return {
mixinData: 'This data is from mixin'
};
},
methods: {
mixinMethod() {
console.log('This method is from mixin');
}
},
mounted() {
console.log('Hook monté depuis mixin');
}
};
2. Utiliser un mixin dans les composants
Ensuite, vous pouvez utiliser l'mixinsoption dans le composant pour introduire cemixin。
Exemple
<div>
<p>{{ mixinData }}</p>
<button @click="mixinMethod">Cliquez-moi</button>
</div>
</template>
<script>
import { myMixin } from './myMixin';
export default {
mixins: [myMixin]
};
</script>
Dans cet exemple,myMixinles ... dansdata、methodsetmountedles hooks seront fusionnés dans le composant.
Règles de fusion pour les mixins
1. fusion des données
Simixinà la fois le mixin et le composant ontdatafonctions, Vue fusionnera les deuxdatavaleurs de retour de fonction viaObject.assignfusion. Si les noms de propriétés entrent en conflit, ceux du composantdataremplaceront ceux dumixindedata。
Exemple
data() {
return {
message: 'Hello from mixin'
};
}
// composant
data() {
return {
message: 'Hello from component'
};
}
// résultat final
data() {
return {
message: 'Hello from component' // les données du composant remplacent les données du mixin
};
}
2. Fusion des hooks de cycle de vie
Simixinle mixin et le composant ont tous les deux le même hook de cycle de vie (p. ex.mounted), Vue les fusionnera dans un tableau et les exécutera dans l'ordre demixinavec le mixin exécuté avant le composant.
Exemple
mounted() {
console.log('Mounted from mixin');
}
// composant
mounted() {
console.log('Mounted from component');
}
// ordre d'exécution
// Monté depuis le mixin
// Monté depuis le composant
3. Fusion des methods et computed
methodsetcomputedLes règles de fusion pour methods et computed sont les mêmes quedatacelles pour data. Si les noms de methods ou les noms de propriétés computed entrent en conflit, les methods ou propriétés computed du composant remplacerontmixincelles du
Limites des mixins
Bien quemixinsest très puissant, il présente aussi certaines limites :
- Conflits de nommage: Si plusieurs
mixinsou composants ont les mêmes noms de propriété ou de méthode, cela peut entraîner un comportement de redéfinition inattendu. - Dépendances implicites:
mixinsLa logique dans le mixin peut dépendre de certains états ou méthodes du composant. Cette dépendance n'est pas suffisamment explicite et peut rendre le code difficile à maintenir. - Mixin global: Si un mixin global est utilisé,
mixinil affectera toutes les instances de Vue, ce qui peut entraîner des effets de bord imprévus.
Alternative : API de composition
Dans Vue 3, l'API de composition offre une manière plus flexible de réutiliser la logique. Grâce àreactive、refet personnaliséshook, vous pouvez encapsuler la logique dans des fonctions réutilisables au lieu de la mélanger dans les composants.
Exemple
import { ref, onMounted } from 'vue';
export function useMixin() {
const mixinData = ref('Ces données proviennent de la Composition API');
function mixinMethod() {
console.log('Cette méthode provient de la Composition API');
}
onMounted(() => {
console.log('Hook monté de la Composition API');
});
return {
mixinData,
mixinMethod
};
}
Ensuite, utilisez-le dans le composant :
Exemple
<div>
<p>{{ mixinData }}</p>
<button @click="mixinMethod">Cliquez-moi</button>
</div>
</template>
<script>
import { useMixin } from './useMixin';
export default {
setup() {
const { mixinData, mixinMethod } = useMixin();
return {
mixinData,
mixinMethod
};
}
};
</script>
Autres extensions
Vue3 API des options