recherche
Maisoninterface WebVoir.jsComment l'API de composition Vue3 encapsule élégamment les composants tiers

Avant-propos

Pour les composants tiers, comment étendre élégamment les fonctions tout en conservant les fonctions d'origine des composants tiers (accessoires, événements, slots, méthodes) ?

Prenons l'exemple de l'el-input d'Element Plus :

Il est très probable que vous ayez déjà joué comme ça, en encapsulant un composant MyInput et en ajoutant les accessoires, les événements, les emplacements et les méthodes à utiliser selon les vôtres besoins. Écrivez-le à nouveau :

// MyInput.vue
<template>
  <div class="my-input">
    <el-input v-model="inputVal" :clearable="clearable" @clear="clear">
    <template #prefix>
      <slot name="prefix"></slot>
    </template>
      <template #suffix>
      <slot name="suffix"></slot>
    </template>
    </el-input>
  </div>
</template>
<script setup>
import { computed } from &#39;vue&#39;
const props = defineProps({
  modelValue: {
    type: String,
    default: &#39;&#39;
  },
  clearable: {
    type: Boolean,
    default: false
  }
})
const emits = defineEmits([&#39;update:modelValue&#39;, &#39;clear&#39;])
const inputVal = computed({
  get: () => props.modelValue,
  set: (val) => {
    emits(&#39;update:modelValue&#39;, val)
  }
})
const clear = () => {
  emits(&#39;clear&#39;)
}
</script>

Mais après un certain temps, les exigences changent et d'autres fonctions du composant el-input doivent être ajoutées au composant MyInput. Le composant el-input a un total de 20 multi-. propriétés, 5 événements et 4 emplacements, que devons-nous faire ? Devons-nous les transmettre un par un, ce qui est non seulement fastidieux, mais également peu lisible.

Dans Vue2, nous pouvons le gérer comme ceci, cliquez ici pour voir l'encapsulation des composants tiers de Vue

Cet article est pour vous aider à transférer des connaissances et à explorer comment utiliser Vue3 CompositionAPI pour encapsuler élégamment des composants tiers~

1 . Pour les accessoires d'attribut et les événements des composants tiers

dans Vue2

  • $attrs : inclut les liaisons d'attributs (à l'exception de la classe et du style) qui ne sont pas reconnues (et obtenues) comme accessoires dans la portée parent. Lorsqu'un composant ne déclare aucun accessoire, toutes les liaisons de portée parent (sauf la classe et le style) seront incluses ici, et les composants internes peuvent être transmis via v-bind="$attrs"

  • $listeners : inclus v- sur l'écouteur d'événement dans la portée parent (sans modificateur .native). Il peut être transmis aux composants internes via v-on="$listeners"

et dans Vue3

  • $attrs : contient des liaisons d'attributs et des événements dans la portée parent qui ne sont pas des accessoires de composant ou des événements personnalisés (y compris la classe , style et événements personnalisés), et les composants internes peuvent être transmis via v-bind="$attrs".

  • L'objet $listeners a été supprimé dans Vue 3. Les écouteurs d'événements font désormais partie de $attrs.

  • Dans

//MyInput.vue 
<template>
  <div class="my-input">
    <el-input v-bind="attrs"></el-input>
  </div>
</template>
<script setup>
import { useAttrs } from &#39;vue&#39;
const attrs = useAttrs()
</script>

Bien sûr, cela ne suffit pas. En écrivant simplement ainsi, les attributs que nous lions (y compris la classe et le style) fonctionneront également sur l'élément racine (l'exemple ci-dessus est le nœud Dom avec class="my-input"). Pour éviter ce comportement par défaut, nous devons définir EnsureAttrs sur false.

Jetons un coup d'œil à l'explication de l'héritageAttrs dans le document Vue3

Par défaut, les liaisons d'attributs dans la portée parent qui ne sont pas reconnues comme des accessoires «retomberont» et seront appliquées à l'enfant en tant qu'attributs HTML ordinaires sur l'élément racine de le composant. Lors de l'écriture d'un composant qui encapsule un élément cible ou un autre composant, cela peut ne pas toujours être conforme au comportement attendu. En définissantheritAttrs sur false, ces comportements par défaut seront supprimés. Ces attributs peuvent être rendus efficaces via la propriété d'instance $attrs et peuvent être explicitement liés à des éléments non root via v-bind.

Nous pouvons donc écrire le code suivant pour gérer les accessoires et les événements des composants tiers :

// MyInput.vue 
<template>
  <div class="my-input">
    <el-input v-bind="attrs"></el-input>
  </div>
</template>
<script>
export default {
  name: &#39;MyInput&#39;,
  inheritAttrs: false
}
</script>
<script setup>
import { useAttrs } from &#39;vue&#39;
const attrs = useAttrs()
</script>

2. Pour les slots des composants tiers

Dans Vue3

  • $slots : nous pouvons l'utiliser Obtenez le slot transmis par le composant parent

  • $scopedSlots a été supprimé dans Vue3, et tous les slots sont exposés en tant que fonctions via $slots

  • La fonction auxiliaire useSlots dans

Sur la base des points ci-dessus, si nous n'ajoutons pas d'emplacements supplémentaires pour le packaging des composants tiers, et que les emplacements des composants tiers sont dans le même nœud dom, nous avons également une méthode de packaging délicate ? ?? ?, obtenez le nom du slot en parcourant $slots, et ajoutez dynamiquement le slot du sous-composant :

//MyInput.vue 
<template>
  <div class="my-input">
    <el-input v-bind="attrs">
      <template v-for="k in Object.keys(slots)" #[k] :key="k">
        <slot :name="k"></slot>
      </template>
    </el-input>
  </div>
</template>
<script>
export default {
  name: &#39;MyInput&#39;,
  inheritAttrs: false
}
</script>
<script setup>
import { useAttrs, useSlots } from &#39;vue&#39;
const attrs = useAttrs()
const slots = useSlots()
</script>

Si les conditions ci-dessus ne sont pas remplies, nous devons ajouter manuellement les slots du tiers requis composants dans le sous-composant ~

3. Méthodes pour composants tiers

Pour les méthodes de composants tiers, nous les implémentons via la réf. Tout d'abord, ajoutez un attribut ref="elInputRef" au composant el-input dans le composant MyInput, puis exposez elInputRef au composant parent via DefineExpose.

Sous composant : MyInput.vue

// MyInput.vue 
<template>
  <div class="my-input">
    <el-input v-bind="attrs" ref="elInputRef">
      <template v-for="k in Object.keys(slots)" #[k] :key="k">
        <slot :name="k"></slot>
      </template>
    </el-input>
  </div>
</template>
<script>
export default {
  name: &#39;MyInput&#39;,
  inheritAttrs: false
}
</script>
<script setup>
import { useAttrs, useSlots } from &#39;vue&#39;
const attrs = useAttrs()
const slots = useSlots()
const elInputRef = ref(null)
defineExpose({
  elInputRef  // <script setup>的组件里的属性默认是关闭的,需通过defineExpose暴露出去才能被调用
})
</script>

Page parent : Index.vue Le code d'appel est le suivant :

// Index.vue 
<template>
  <my-input v-model=&#39;input&#39; ref="myInput">
    <template #prefix>姓名</template>
  </my-input>
</template>
<script setup>
import MyInput from &#39;./components/MyInput.vue&#39;
import { ref, onMounted } from &#39;vue&#39;
const input = ref(&#39;&#39;)
const myInput = ref(null) // 组件实例
onMounted(()=> {
  myInput.value.elInputRef.focus() // 初始化时调用elInputRef实例的focus方法
})
</script>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
React, Vue et l'avenir du frontend de NetflixReact, Vue et l'avenir du frontend de NetflixApr 12, 2025 am 12:12 AM

Netflix utilise principalement React comme cadre frontal, complété par Vue pour des fonctions spécifiques. 1) La composante de React et le DOM virtuel améliorent l'efficacité des performances et du développement des applications Netflix. 2) Vue est utilisée dans les outils internes et les petits projets de Netflix, et sa flexibilité et sa facilité d'utilisation sont essentielles.

Vue.js dans le frontend: applications et exemples du monde réelVue.js dans le frontend: applications et exemples du monde réelApr 11, 2025 am 12:12 AM

Vue.js est un cadre JavaScript progressif adapté à la création d'interfaces utilisateur complexes. 1) Ses concepts principaux incluent des données réactives, une composontisation et un DOM virtuel. 2) Dans les applications pratiques, il peut être démontré en créant des applications TODO et en intégrant Vuerouter. 3) Lors du débogage, il est recommandé d'utiliser Vuedevtools et Console.log. 4) L'optimisation des performances peut être obtenue via V-IF / V-show, l'optimisation de rendu de liste, la charge asynchrone des composants, etc.

Vue.js et réagir: comprendre les principales différencesVue.js et réagir: comprendre les principales différencesApr 10, 2025 am 09:26 AM

Vue.js convient aux projets de petite et moyenne taille, tandis que React convient plus aux applications grandes et complexes. 1. Le système réactif de Vue.js met automatiquement à jour le DOM par le suivi de la dépendance, ce qui facilite la gestion des changements de données. 2.Reacte adopte un flux de données unidirectionnel et les données circulent du composant parent au composant enfant, fournissant un flux de données clair et une structure facile à déborder.

Vue.js vs react: Considérations spécifiques au projetVue.js vs react: Considérations spécifiques au projetApr 09, 2025 am 12:01 AM

Vue.js convient aux projets de petite et moyenne taille et aux itérations rapides, tandis que React convient aux applications grandes et complexes. 1) Vue.js est facile à utiliser et convient aux situations où l'équipe est insuffisante ou l'échelle du projet est petite. 2) React a un écosystème plus riche et convient aux projets avec des performances élevées et des besoins fonctionnels complexes.

Comment sauter une balise à VueComment sauter une balise à VueApr 08, 2025 am 09:24 AM

Les méthodes pour implémenter le saut d'une balise dans Vue incluent: l'utilisation de la balise A dans le modèle HTML pour spécifier l'attribut HREF. Utilisez le composant routeur-link du routage Vue. Utilisez cette méthode. $ Router.push () dans JavaScript. Les paramètres peuvent être passés à travers le paramètre de requête et les itinéraires sont configurés dans les options de routeur pour les sauts dynamiques.

Comment implémenter un saut de composants pour VueComment implémenter un saut de composants pour VueApr 08, 2025 am 09:21 AM

Il existe les méthodes suivantes pour implémenter le saut de composants dans Vue: Utilisez Router-Link et & lt; Router-View & gt; Composants pour effectuer un saut hyperlien et spécifiez: pour attribuer comme chemin cible. Utilisez le & lt; Router-View & gt; Composant directement pour afficher les composants rendus actuellement routés. Utilisez le router.push () et le router.replace () pour la navigation programmatique. Le premier sauve l'histoire et le second remplace l'itinéraire actuel sans quitter les enregistrements.

Comment sauter à la div de VueComment sauter à la div de VueApr 08, 2025 am 09:18 AM

Il existe deux façons de sauter des éléments div dans Vue: Utilisez le routeur Vue et ajoutez le composant routeur-link. Ajoutez l'écouteur de l'événement @Click et appelez ceci. $ Router.push () pour sauter.

Comment transférer la valeur en sautant VueComment transférer la valeur en sautant VueApr 08, 2025 am 09:15 AM

Il existe deux façons principales de transmettre des données dans Vue: accessoires: liaison de données unidirectionnelle, transmettant les données du composant parent au composant enfant. Événements: transmettez les données entre les composants à l'aide d'événements et d'événements personnalisés.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

MinGW - GNU minimaliste pour Windows

MinGW - GNU minimaliste pour Windows

Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

DVWA

DVWA

Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

Navigateur d'examen sécurisé

Navigateur d'examen sécurisé

Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.