suchen
HeimWeb-FrontendView.jsWie die Vue3 Composition API Komponenten von Drittanbietern elegant kapselt

Vorwort

Wie kann man bei Komponenten von Drittanbietern die Funktionen elegant erweitern und gleichzeitig die ursprünglichen Funktionen der Komponenten von Drittanbietern (Requisiten, Ereignisse, Slots, Methoden) beibehalten?

Nehmen Sie den El-Input von Element Plus als Beispiel:

Es ist sehr wahrscheinlich, dass Sie schon einmal so gespielt haben, indem Sie eine MyInput-Komponente gekapselt und die Requisiten, Ereignisse, Slots und Methoden hinzugefügt haben, die Sie entsprechend Ihren eigenen verwenden möchten Schreiben Sie es noch einmal:

// 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>

Aber nach einiger Zeit ändern sich die Anforderungen und andere Funktionen der el-input-Komponente müssen zur MyInput-Komponente hinzugefügt werden. Eigenschaften, 5 Ereignisse und 4 Slots, was sollen wir tun? Das ist nicht nur umständlich, sondern hat auch eine schlechte Lesbarkeit.

In Vue2 können wir damit umgehen. Klicken Sie hier, um die Kapselung von Vue-Komponenten von Drittanbietern anzuzeigen.

Dieser Artikel soll Ihnen beim Wissenstransfer helfen und erkunden, wie Sie Vue3 CompositionAPI verwenden, um Komponenten von Drittanbietern elegant zu kapseln ~

1 . Für die Attribut-Requisiten und Ereignisse von Drittanbieter-Komponenten

in Vue2

  • $attrs: Enthält Attributbindungen (außer Klasse und Stil), die im übergeordneten Bereich nicht als Requisiten erkannt (und abgerufen) werden. Wenn eine Komponente keine Requisiten deklariert, werden alle übergeordneten Bereichsbindungen (außer Klasse und Stil) hier einbezogen, und interne Komponenten können über v-bind="$attrs"

  • $listeners: Included v- übergeben werden. auf dem Ereignis-Listener im übergeordneten Bereich (ohne .native-Modifikator). Es kann über v-on="$listeners"

und in Vue3

  • an interne Komponenten übergeben werden. $attrs: enthält Attributbindungen und Ereignisse im übergeordneten Bereich, die keine Komponenten-Requisiten oder benutzerdefinierten Ereignisse sind (einschließlich Klasse). , Stil und benutzerdefinierte Ereignisse) und interne Komponenten können über v-bind="$attrs" übergeben werden.

  • $listeners-Objekt wurde in Vue 3 entfernt. Ereignis-Listener sind jetzt Teil von $attrs.

  • Im kann die Hilfsfunktion useAttrs $attrs abrufen.

//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>

Natürlich ist das nicht genug. Wenn Sie einfach so schreiben, funktionieren die von uns gebundenen Attribute (einschließlich Klasse und Stil) auch für das Stammelement (das obige Beispiel ist der Dom-Knoten mit class="my-input"). Um dieses Standardverhalten zu verhindern, müssen wir inheritAttrs auf false setzen.

Werfen wir einen Blick auf die Erklärung des Vue3-Dokuments zu inheritAttrs

Standardmäßig werden Attributbindungen im übergeordneten Bereich, die nicht als Requisiten erkannt werden, „zurückgegriffen“ und als normale HTML-Attribute auf das Stammelement von auf das untergeordnete Element angewendet die Komponente. Beim Schreiben einer Komponente, die ein Zielelement oder eine andere Komponente umschließt, entspricht dies möglicherweise nicht immer dem erwarteten Verhalten. Durch Festlegen von inheritAttrs auf „false“ werden diese Standardverhalten entfernt. Diese Attribute können durch die Instanzeigenschaft $attrs wirksam gemacht und über v-bind explizit an Nicht-Root-Elemente gebunden werden.

Wir können also den folgenden Code schreiben, um die Requisiten und Ereignisse von Komponenten von Drittanbietern zu verarbeiten:

// 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. Für die Slots von Komponenten von Drittanbietern

In Vue3

  • $slots: Wir können ihn verwenden Holen Sie sich den von der übergeordneten Komponente übergebenen Slot

  • $scopedSlots wurde in Vue3 entfernt und alle Slots werden als Funktionen über $slots verfügbar gemacht

  • Die Hilfsfunktion useSlots in

Wenn wir auf der Grundlage der oben genannten Punkte keine zusätzlichen Steckplätze für die Verpackung von Komponenten von Drittanbietern hinzufügen und sich die Steckplätze der Komponenten von Drittanbietern im selben Dom-Knoten befinden, haben wir dann auch eine knifflige Verpackungsmethode? ?? ?, erhalten Sie den Namen des Slots, indem Sie $slots durchlaufen, und fügen Sie dynamisch den Slot der Unterkomponente hinzu:

//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>

Wenn die oben genannten Bedingungen nicht erfüllt sind, müssen wir die Slots des erforderlichen Drittanbieters manuell hinzufügen Komponenten in der Unterkomponente ~

3. Methoden für Komponenten von Drittanbietern

Für Methoden von Komponenten von Drittanbietern implementieren wir diese über ref. Fügen Sie zunächst ein ref="elInputRef"-Attribut zur el-input-Komponente in der MyInput-Komponente hinzu und machen Sie dann elInputRef über defineExpose für die übergeordnete Komponente verfügbar.

Unterkomponente: 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>

Übergeordnete Seite: Der Aufrufcode von Index.vue lautet wie folgt:

// 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>

Das obige ist der detaillierte Inhalt vonWie die Vue3 Composition API Komponenten von Drittanbietern elegant kapselt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Dieser Artikel ist reproduziert unter:亿速云. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vue.js und der Frontend Stack: Verständnis der VerbindungenVue.js und der Frontend Stack: Verständnis der VerbindungenApr 24, 2025 am 12:19 AM

Vue.js ist eng in den Front-End-Technologie-Stack integriert, um die Entwicklungseffizienz und die Benutzererfahrung zu verbessern. 1) Konstruktionstools: Integrieren Sie sich in Webpack und Rollup, um eine modulare Entwicklung zu erzielen. 2) Staatsmanagement: Integrieren Sie sich in Vuex, um den komplexen Anwendungsstatus zu verwalten. 3) Routing: Integrieren Sie sich in Vuerouter, um einseitige Anwendungsrouting zu realisieren. 4) CSS -Präprozessor: Unterstützt SASS und weniger, um die Stilentwicklungseffizienz zu verbessern.

Netflix: Erforschung der Verwendung von React (oder anderen Frameworks)Netflix: Erforschung der Verwendung von React (oder anderen Frameworks)Apr 23, 2025 am 12:02 AM

Netflix wählte React, um seine Benutzeroberfläche zu erstellen, da die Komponentendesign und der virtuelle DOM -Mechanismus von React komplexe Schnittstellen und häufige Updates effizient verarbeiten können. 1) Komponentenbasiertes Design ermöglicht es Netflix, die Schnittstelle in überschaubare Widgets zu unterteilen und die Entwicklungseffizienz und Code-Wartbarkeit zu verbessern. 2) Der virtuelle DOM -Mechanismus sorgt für die Glätte und hohe Leistung der Netflix -Benutzeroberfläche durch Minimierung von DOM -Operationen.

Vue.js und das Frontend: Ein tiefer Eintauchen in den RahmenVue.js und das Frontend: Ein tiefer Eintauchen in den RahmenApr 22, 2025 am 12:04 AM

Vue.js wird von Entwicklern geliebt, weil es einfach zu bedienen und mächtig ist. 1) Das reaktionsschnelle Datenbindungssystem aktualisiert die Ansicht automatisch. 2) Das Komponentensystem verbessert die Wiederverwendbarkeit und Wartbarkeit des Codes. 3) Computereigenschaften und Hörer verbessern die Lesbarkeit und Leistung des Codes. 4) Die Verwendung von Vodevtools und Überprüfung auf Konsolenfehler sind häufige Debugging -Techniken. 5) Die Leistungsoptimierung umfasst die Verwendung von Schlüsselattributen, berechneten Attributen und Keep-Alive-Komponenten. 6) Zu den Best Practices zählen eindeutige Komponentenbenennungen, die Verwendung von Einzeldateikomponenten und die rationale Verwendung von Lebenszyklushaken.

Die Kraft von Vue.js am Frontend: Schlüsselmerkmale und VorteileDie Kraft von Vue.js am Frontend: Schlüsselmerkmale und VorteileApr 21, 2025 am 12:07 AM

VUE.JS ist ein progressives JavaScript-Framework, das zum Aufbau effizienter und wartbarer Front-End-Anwendungen geeignet ist. Zu den wichtigsten Merkmalen gehören: 1. Responsive Datenbindung, 2. Komponentenentwicklung, 3. Virtual DOM. Durch diese Funktionen vereinfacht Vue.js den Entwicklungsprozess, verbessert die Anwendungsleistung und -wartbarkeit und macht ihn in der modernen Webentwicklung sehr beliebt.

Ist Vue.js besser als React?Ist Vue.js besser als React?Apr 20, 2025 am 12:05 AM

Vue.js und reagieren jeweils ihre eigenen Vor- und Nachteile, und die Wahl hängt von den Projektanforderungen und den Teambedingungen ab. 1) Vue.js eignet sich aufgrund seiner Einfachheit und einfach zu bedienung für kleine Projekte und Anfänger. 2) React ist aufgrund seines reichhaltigen Ökosystem- und Komponentendesigns für große Projekte und komplexe Benutzeroberflächen geeignet.

VUE.JS -Funktion: Verbesserung der Benutzererfahrung am FrontendVUE.JS -Funktion: Verbesserung der Benutzererfahrung am FrontendApr 19, 2025 am 12:13 AM

Vue.js verbessert die Benutzererfahrung durch mehrere Funktionen: 1. Responsives System realisiert Echtzeitdaten-Feedback; 2. Die Komponentenentwicklung verbessert die Wiederverwendbarkeit des Codes; 3.. Vuerouter bietet eine reibungslose Navigation; 4. Dynamische Datenbindung und Übergangsanimation verbessern den Interaktionseffekt; 5. Fehlerverarbeitungsmechanismus sorgt für das Feedback der Benutzer. 6. Leistungsoptimierung und Best Practices verbessern die Anwendungsleistung.

VUE.JS: Definieren seiner Rolle in der WebentwicklungVUE.JS: Definieren seiner Rolle in der WebentwicklungApr 18, 2025 am 12:07 AM

Vue.js 'Rolle in der Webentwicklung besteht darin, als progressives JavaScript -Framework zu fungieren, das den Entwicklungsprozess vereinfacht und die Effizienz verbessert. 1) Es ermöglicht Entwicklern, sich auf Geschäftslogik durch reaktionsschnelle Datenbindung und Komponentenentwicklung zu konzentrieren. 2) Das Arbeitsprinzip von Vue.js beruht auf reaktionsschnellen Systemen und virtuellem DOM, um die Leistung zu optimieren. 3) In den tatsächlichen Projekten ist es üblich, Vuex zu verwenden, um den globalen Zustand zu verwalten und die Datenreaktionsfähigkeit zu optimieren.

Vue.js verstehen: vor allem ein Frontend -FrameworkVue.js verstehen: vor allem ein Frontend -FrameworkApr 17, 2025 am 12:20 AM

Vue.js ist ein progressives JavaScript -Framework, das von Ihnen Yuxi im Jahr 2014 veröffentlicht wurde, um eine Benutzeroberfläche zu erstellen. Zu den Kernvorteilen gehören: 1. Responsive Datenbindung, automatische Aktualisierungsansicht von Datenänderungen; 2. Komponentenentwicklung kann die Benutzeroberfläche in unabhängige und wiederverwendbare Komponenten aufgeteilt werden.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.