cari
Rumahhujung hadapan webView.jsApakah prinsip pelaksanaan Slot slot Vue3?

Apakah prinsip pelaksanaan Slot slot Vue3?

May 24, 2023 am 09:28 AM
vue3slot

Takrifan rasmi slot Vue

Vue melaksanakan satu set API pengedaran kandungan Reka bentuk API ini diinspirasikan oleh draf spesifikasi Komponen Web, menggunakan elemen <slot></slot> sebagai saluran untuk membawa kandungan yang diedarkan. .

Apa sebenarnya Slot

Jadi apa sebenarnya Slot? Slot sebenarnya adalah fungsi yang menerima kandungan slot yang diluluskan oleh komponen induk, kemudian menjana VNode dan mengembalikannya.

Kami biasanya menggunakan pasangan tag <slot></slot> untuk menerima kandungan yang diluluskan oleh komponen induk Kemudian, selepas penyusunan akhir pasangan teg ini, ia adalah fungsi yang mencipta VNode ia satu fungsi yang mencipta slot VNode.

// <slot></slot>标签被vue3编译之后的内容
export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return _renderSlot(_ctx.$slots, "default")
}

Kita dapat melihat dengan jelas bahawa tag <slot></slot> menjadi fungsi yang dipanggil _renderSlot selepas disusun oleh Vue3.

Cara menggunakan slot

Untuk menggunakan slot, komponen ibu bapa dan anak mesti wujud.

Andaikan komponen induk mempunyai kandungan berikut:

<todo-button>
  Add todo
</todo-button>

Kami menggunakan komponen anak todo-button dalam komponen induk dan lulus kandungan slot Add todo.

kandungan templat subkomponen butang-todo

<button class="btn-primary">
  <slot></slot>
</button>

Apabila komponen dipaparkan, <slot></slot> akan digantikan dengan "Tambah todo".

Menyemak prinsip pemaparan komponen

Jadi apakah prinsip asasnya? Sebelum memahami prinsip asas slot, kami juga perlu menyemak prinsip operasi komponen Vue3.

Inti komponen ialah ia boleh menghasilkan sekumpulan VNode. Bagi Vue, teras komponen ialah fungsi pemaparannya Intipati pemasangan komponen adalah untuk melaksanakan fungsi pemaparan dan mendapatkan VNode yang akan diberikan Bagi data/props/dikira, ini semua digunakan untuk menyediakan data untuk fungsi rendering untuk menjana VNode Perkara yang paling penting tentang perkhidmatan sumber ialah VNode akhirnya dihasilkan oleh komponen, kerana ini adalah kandungan yang perlu diberikan.

Prinsip pemulaan slot

Apabila Vue3 menemui jenis komponen VNode, ia akan memasuki proses pemaparan komponen. Proses pemaparan komponen adalah untuk membuat contoh komponen dahulu, dan kemudian memulakan tika komponen Apabila memulakan tika komponen, kandungan berkaitan Slot akan diproses.

Dalam runtime-coresrccomponent.ts kod sumber

Apakah prinsip pelaksanaan Slot slot Vue3?

Mulakan kandungan berkaitan Slot komponen dalam fungsi initSlots

Kemudian fungsi initSlots adalah panjang Jadi, apa yang telah anda lakukan?

runtime-coresrccomponentSlots.ts

Apakah prinsip pelaksanaan Slot slot Vue3?

Pertama sekali, kita perlu menentukan sama ada komponen itu ialah komponen Slot komponen Slot? Mula-mula kita perlu kembali dan melihat kod terkumpul komponen induk di atas:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  const _component_todo_button = _resolveComponent("todo-button")
  return (_openBlock(), _createBlock(_component_todo_button, null, {
    default: _withCtx(() => [
      _createTextVNode(" Add todo ")
    ], undefined, true),
    _: 1 /* STABLE */
  }))
}

Kita dapat melihat bahawa kandungan kanak-kanak bagi komponen Slot ialah jenis Objek, iaitu kod berikut:

{
    default: _withCtx(() => [
      _createTextVNode(" Add todo ")
    ], undefined, true),
    _: 1 /* STABLE */
}

Kemudian Apabila VNode komponen ini dibuat, ia akan dinilai sama ada anak-anaknya adalah jenis Object Jika ia adalah jenis Object, maka tag komponen Slot akan dilampirkan pada shapeFlag bagi VNode. komponen tersebut.

Jika ia disusun melalui templat, ia adalah kanak-kanak slot standard, dengan atribut _, yang boleh diletakkan terus pada contoh komponen. slots

Jika ia adalah objek slot yang ditulis oleh pengguna sendiri, maka tiada atribut

, jadi ia perlu diseragamkan, menggunakan _. normalizeObjectSlots

Jika tingkah laku pengguna tidak mengikut peraturan, maka ikuti proses

. normalizeVNodeSlots

Menghuraikan kandungan dalam slot

Mari kita lihat dahulu kod selepas subkomponen disusun:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createElementBlock("button", { class: "btn-primary" }, [
    _renderSlot(_ctx.$slots, "default")
  ]))
}

Kami juga membincangkannya di atas selepas tag

ialah disusun oleh vue3 Ia menjadi fungsi yang dipanggil <slot></slot>. Fungsi _renderSlot

Apakah prinsip pelaksanaan Slot slot Vue3?

menerima lima parameter, yang pertama ialah objek fungsi slot pada contoh renderSlot, dan yang kedua ialah nama slot, iaitu Paparkan kandungan slot ke lokasi yang ditentukan Yang ketiga ialah slots yang diterima oleh skop slot Yang keempat ialah fungsi pemaparan kandungan lalai bagi slot yang kelima. props

Prinsip Slot Skop

Slot Skop ialah cara untuk komponen kanak-kanak menghantar parameter daripada komponen induk, membenarkan kandungan slot mengakses data hanya dalam komponen anak.

Templat komponen kanak-kanak

<slot username="coboy"></slot>

Kod tersusun

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return _renderSlot(_ctx.$slots, "default", { username: "coboy" })
}

Templat komponen induk

<todo-button>
    <template v-slot:default="slotProps">
        {{ slotProps.username }}
    </template>
</todo-button>

Kod tersusun

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  const _component_todo_button = _resolveComponent("todo-button")
  return (_openBlock(), _createBlock(_component_todo_button, null, {
    default: _withCtx((slotProps) => [
      _createTextVNode(_toDisplayString(slotProps.username), 1 /* TEXT */)
    ]),
    _: 1 /* STABLE */
  }))
}

Seperti yang dinyatakan di atas Melalui renderSlot fungsi, ia boleh diringkaskan secara ringkas sebagai kod berikut

export function renderSlots(slots, name, props) {
  const slot = slots[name]
  if (slot) {
    if (typeof slot === &#39;function&#39;) {
      return createVNode(Fragment, {}, slot(props))
    }
  }
}

ialah kandungan slot yang dimuat naik oleh contoh komponen, sebenarnya kandungan ini slots

{
    default: _withCtx((slotProps) => [
      _createTextVNode(_toDisplayString(slotProps.username), 1 /* TEXT */)
    ]),
    _: 1 /* STABLE */
}

nama adalah lalai , kemudian slots[ name] mendapat fungsi berikut

_withCtx((slotProps) => [
      _createTextVNode(_toDisplayString(slotProps.username), 1 /* TEXT */)
])

slot(props), yang jelas merupakan slot({ username: "coboy" }), yang memindahkan data dalam komponen anak ke kandungan slot komponen induk Hit.

具名插槽原理

有时我们需要多个插槽。例如对于一个带有如下模板的 <base-layout></base-layout> 组件:

<div class="container">
  <header>
    <!-- 我们希望把页头放这里 -->
  </header>
  <main>
    <!-- 我们希望把主要内容放这里 -->
  </main>
  <footer>
    <!-- 我们希望把页脚放这里 -->
  </footer>
</div>

对于这样的情况,<slot></slot> 元素有一个特殊的 attribute:name。通过它可以为不同的插槽分配独立的 ID,也就能够以此来决定内容应该渲染到什么地方:

<!--子组件-->
<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

一个不带 name 的 <slot></slot> 出口会带有隐含的名字“default”。

在向具名插槽提供内容的时候,我们可以在一个 <template></template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称:

<!--父组件-->
<base-layout>
  <template v-slot:header>
    <h2 id="header">header</h2>
  </template>
  <template v-slot:default>
    <p>default</p>
  </template>
  <template v-slot:footer>
    <p>footer</p>
  </template>
</base-layout>

父组件编译之后的内容:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  const _component_base_layout = _resolveComponent("base-layout")
  return (_openBlock(), _createBlock(_component_base_layout, null, {
    header: _withCtx(() => [
      _createElementVNode("h2", null, "header")
    ]),
    default: _withCtx(() => [
      _createElementVNode("p", null, "default")
    ]),
    footer: _withCtx(() => [
      _createElementVNode("p", null, "footer")
    ]),
    _: 1 /* STABLE */
  }))
}

子组件编译之后的内容:

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createElementBlock("div", { class: "container" }, [
    _createElementVNode("header", null, [
      _renderSlot(_ctx.$slots, "header")
    ]),
    _createElementVNode("main", null, [
      _renderSlot(_ctx.$slots, "default")
    ]),
    _createElementVNode("footer", null, [
      _renderSlot(_ctx.$slots, "footer")
    ])
  ]))
}

通过子组件编译之后的内容我们可以看到这三个Slot渲染函数

_renderSlot(_ctx.$slots, "header")

_renderSlot(_ctx.$slots, "default")

_renderSlot(_ctx.$slots, "footer")

然后我们再回顾一下renderSlot渲染函数

// renderSlots的简化
export function renderSlots(slots, name, props) {
  const slot = slots[name]
  if (slot) {
    if (typeof slot === &#39;function&#39;) {
      return createVNode(Fragment, {}, slot(props))
    }
  }
}

这个时候我们就可以很清楚的知道所谓具名函数是通过renderSlots渲染函数的第二参数去定位要渲染的父组件提供的插槽内容。父组件的插槽内容编译之后变成了一个Object的数据类型。

{
    header: _withCtx(() => [
      _createElementVNode("h2", null, "header")
    ]),
    default: _withCtx(() => [
      _createElementVNode("p", null, "default")
    ]),
    footer: _withCtx(() => [
      _createElementVNode("p", null, "footer")
    ]),
    _: 1 /* STABLE */
}

默认内容插槽的原理

我们可能希望这个 <button></button> 内绝大多数情况下都渲染“Submit”文本。为了将“Submit”作为备用内容,我们可以将它放在 <slot></slot> 标签内

<button type="submit">
  <slot>Submit</slot>
</button>

现在当我们在一个父级组件中使用 &lt;submit-button&gt;&lt;/submit-button&gt; 并且不提供任何插槽内容时:

&lt;submit-button&gt;&lt;/submit-button&gt;

备用内容“Submit”将会被渲染:

<button type="submit">
  Submit
</button>

但是如果我们提供内容:

<submit-button>
  Save
</submit-button>

则这个提供的内容将会被渲染从而取代备用内容:

<button type="submit">
  Save
</button>

这其中的原理是什么呢?我们先来看看上面默认内容插槽编译之后的代码

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createElementBlock("button", { type: "submit" }, [
    _renderSlot(_ctx.$slots, "default", {}, () => [
      _createTextVNode("Submit")
    ])
  ]))
}

我们可以看到插槽函数的内容是这样的

_renderSlot(_ctx.$slots, "default", {}, () => [
    _createTextVNode("Submit")
])

我们再回顾看一下renderSlot函数

renderSlot函数接受五个参数,第四个是插槽的默认内容渲染函数。

Apakah prinsip pelaksanaan Slot slot Vue3?

再通过renderSlot函数的源码我们可以看到,

第一步,先获取父组件提供的内容插槽的内容,

在第二个步骤中,若父组件已提供插槽内容,则使用该插槽内容,否则执行默认的内容渲染函数以获取默认内容。

Atas ialah kandungan terperinci Apakah prinsip pelaksanaan Slot slot Vue3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:亿速云. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Vue.js vs React: Komuniti, Ekosistem, dan SokonganVue.js vs React: Komuniti, Ekosistem, dan SokonganApr 27, 2025 am 12:24 AM

Vue.js dan bertindak balas masing -masing mempunyai kelebihan sendiri, dan pilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan. 1. Vue.js adalah mesra komuniti, menyediakan sumber pembelajaran yang kaya, dan ekosistem termasuk alat rasmi seperti Vuerouter, yang disokong oleh pasukan rasmi dan masyarakat. 2. Komuniti React adalah berat sebelah terhadap aplikasi perusahaan, dengan ekosistem yang kuat, dan sokongan yang disediakan oleh Facebook dan komuniti, dan mempunyai kemas kini yang kerap.

React dan Netflix: Meneroka HubunganReact dan Netflix: Meneroka HubunganApr 26, 2025 am 12:11 AM

Netflix menggunakan React untuk meningkatkan pengalaman pengguna. 1) Ciri -ciri komponen React membantu Netflix Split Complex UI ke dalam modul yang boleh diurus. 2) Maya DOM mengoptimumkan kemas kini UI dan meningkatkan prestasi. 3) Menggabungkan Redux dan GraphQL, Netflix dengan cekap menguruskan status aplikasi dan aliran data.

VUE.JS vs Rangka Kerja Backend: Menjelaskan perbezaanVUE.JS vs Rangka Kerja Backend: Menjelaskan perbezaanApr 25, 2025 am 12:05 AM

Vue.js adalah kerangka depan, dan rangka kerja belakang digunakan untuk mengendalikan logik sisi pelayan. 1) Vue.js memberi tumpuan kepada membina antara muka pengguna dan memudahkan pembangunan melalui pengikatan data komponen dan responsif. 2) Rangka kerja back-end seperti Express dan Django mengendalikan permintaan HTTP, operasi pangkalan data dan logik perniagaan, dan dijalankan di pelayan.

Vue.js dan stack frontend: Memahami sambunganVue.js dan stack frontend: Memahami sambunganApr 24, 2025 am 12:19 AM

Vue.js disepadukan dengan tumpuan teknologi front-end untuk meningkatkan kecekapan pembangunan dan pengalaman pengguna. 1) Alat Pembinaan: Mengintegrasikan dengan Webpack dan Rollup untuk mencapai pembangunan modular. 2) Pengurusan Negeri: Bersepadu dengan VUEX untuk menguruskan status aplikasi yang kompleks. 3) Routing: Mengintegrasikan dengan Vuerouter untuk merealisasikan penghalaan aplikasi tunggal halaman. 4) Preprocessor CSS: Menyokong SASS dan kurang untuk meningkatkan kecekapan pembangunan gaya.

Netflix: Meneroka Penggunaan React (atau Rangka Kerja Lain)Netflix: Meneroka Penggunaan React (atau Rangka Kerja Lain)Apr 23, 2025 am 12:02 AM

Netflix memilih React untuk membina antara muka penggunanya kerana reka bentuk komponen React dan mekanisme DOM maya dapat mengendalikan antara muka yang kompleks dan kemas kini yang kerap. 1) Reka bentuk berasaskan komponen membolehkan Netflix memecah antara muka ke dalam widget yang boleh diurus, meningkatkan kecekapan pembangunan dan pemeliharaan kod. 2) Mekanisme DOM maya memastikan kelancaran dan prestasi tinggi antara muka pengguna Netflix dengan meminimumkan operasi DOM.

Vue.js dan frontend: menyelam mendalam ke dalam rangka kerjaVue.js dan frontend: menyelam mendalam ke dalam rangka kerjaApr 22, 2025 am 12:04 AM

Vue.js disukai oleh pemaju kerana mudah digunakan dan berkuasa. 1) Sistem pengikat data responsifnya secara automatik mengemas kini paparan. 2) Sistem komponen meningkatkan kebolehgunaan semula dan mengekalkan kod. 3) Ciri -ciri pengkomputeran dan pendengar meningkatkan kebolehbacaan dan prestasi kod. 4) Menggunakan vuedevtools dan memeriksa kesilapan konsol adalah teknik debugging biasa. 5) Pengoptimuman Prestasi termasuk penggunaan atribut utama, atribut yang dikira dan komponen-komponen Alive. 6) Amalan terbaik termasuk penamaan komponen yang jelas, penggunaan komponen fail tunggal dan penggunaan cangkuk kitaran hidup yang rasional.

Kekuatan Vue.js di Frontend: Ciri dan Manfaat UtamaKekuatan Vue.js di Frontend: Ciri dan Manfaat UtamaApr 21, 2025 am 12:07 AM

Vue.js adalah rangka kerja JavaScript yang progresif yang sesuai untuk membina aplikasi front-end yang cekap dan boleh dipelihara. Ciri -ciri utamanya termasuk: 1. Pengikatan data responsif, 2. Pembangunan Komponen, 3. Dom maya. Melalui ciri -ciri ini, Vue.js memudahkan proses pembangunan, meningkatkan prestasi aplikasi dan mengekalkan, menjadikannya sangat popular dalam pembangunan web moden.

Adakah vue.js lebih baik daripada bertindak balas?Adakah vue.js lebih baik daripada bertindak balas?Apr 20, 2025 am 12:05 AM

Vue.js dan bertindak balas masing -masing mempunyai kelebihan dan kekurangan mereka sendiri, dan pilihannya bergantung kepada keperluan projek dan keadaan pasukan. 1) vue.js sesuai untuk projek kecil dan pemula kerana kesederhanaan dan mudah digunakan; 2) React sesuai untuk projek besar dan UI yang kompleks kerana reka bentuk ekosistem dan komponennya yang kaya.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),