成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Vue中的嵌套插槽(包括作用域插槽)

開發 前端
最近我弄清楚了如何遞歸地實現嵌套插槽,包括如何使用作用域插槽來實現。起因是我想看看是否可以構建一個復制v-for指令但僅使用template組件。

本文轉載自微信公眾號「大遷世界」,轉載本文請聯系大遷世界公眾號。

最近我弄清楚了如何遞歸地實現嵌套插槽,包括如何使用作用域插槽來實現。起因是我想看看是否可以構建一個復制v-for指令但僅使用template組件。

[[327520]]

它還支持插槽和作用域插槽,也可以支持命名插槽,我們可以這樣使用它:

  1. <template> 
  2.   <div> 
  3.     <!-- Regular list --> 
  4.     <v-for :list="list" /> 
  5.  
  6.     <!-- List with bolded items --> 
  7.     <v-for :list="list"> 
  8.       <template v-slot="{ item }"> 
  9.         <strong>{{ item }}</strong> 
  10.       </template> 
  11.     </v-for> 
  12.   </div> 
  13. </template> 

第一個將正常打印列表,而第二個將每個項包裝在標記中。

這不是一個非常有用的組件,但可以從中學到的最多,我們來看看。

無循環實現循環

通常,當我們要渲染元素或組件的列表時,可以使用v-for指令,但這次我們希望完全擺脫它。

那么,我們如何在不使用循環的情況下渲染項目列表呢?就是使用 「遞歸」。

我們可以使用遞歸來渲染項目列表。過程并不會復雜,我們來看看怎么做。

遞歸表示一個列表

我在大學里最喜歡的課程之一是[“編程語言概念”][1]。

對我來說,最有趣的部分是探索函數式編程和邏輯編程,并了解與命令式編程的區別(Javascript 和最流行的語言是命令式編程)。

這門課讓我真正了解如何使用遞歸,因為在純函數語言中,一切都是遞歸。不管怎樣,從那門課我學到了可以使用遞歸地表示一個列表。

與使用數組不同,每個列表是一個值(頭)和另一個列表(尾)。

  1. [head, tail] 

例如要表示列表[1、2、3],則可以遞歸方式表示為:

  1. [1, [2, [3, null]]] 

我們必須以某種方式結束列表,因此我們使用null而不是另一個數組(也可以使用空數組)。

看到這里,你或許就可以明白了,我們可以使用此概念并將其應用于我們的組件。相反,我們將遞歸嵌套組件以表示列表。

我們最終將渲染出這樣的內容。注意我們“list”的嵌套結構:

  1. <div> 
  2.   1 
  3.   <div> 
  4.     2 
  5.     <div> 
  6.       3 
  7.     </div> 
  8.   </div> 
  9. </div> 

誠然,這與v-for渲染的效果并不完全相同,但這也不是本練習的重點。

構建組件

首先,我們將解決遞歸渲染項目列表的問題。

(1) 使用遞歸來渲染列表

這次我們使用一個普通數組,而不是使用前面介紹的遞歸列表:

  1. [1, 2, 3] 

這里要討論兩種情況:

  • 基本情形-渲染列表中的第一項
  • 遞歸情形-渲染項目,然后沉浸下一個列表

我們把[1,2,3]傳給v-for

  1. <template> 
  2.   <v-for :list="[1, 2, 3]" /> 
  3. </template> 

我們希望獲取列表中的第一項,即1,并顯示它

  1. <template> 
  2.   <div> 
  3.     {{ list[0] }} 
  4.   </div> 
  5. </template> 

現在,該組件將渲染1,就像我們期望的那樣。

但是我們不能只渲染第一個值并停止。我們需要渲染值,然后還渲染列表的其余部分:

  1. <template> 
  2.   <div> 
  3.     {{ list[0] }} 
  4.     <v-for :list="list.slice(1)" /> 
  5.   </div> 
  6. </template> 

我們不傳遞整個list數組,而是刪除第一項并傳遞新數組。第一個項目我們已經打印出來了,所以沒有必要保留它。

順序是這樣的:

  • 我們將[1,2,3]傳遞到v-for中進行渲染
  • 我們的v-for組件渲染1,然后將[2,3]傳遞到下一個v-for進行渲染
  • 取[2,3]并渲染2,然后將[3]傳遞到下一個v-for
  • 最后一個v-for組件渲染出3,我們已經打印出列表!

現在,我們的Vue應用程序的結構如下所示:

  1. <App> 
  2.   <v-for> 
  3.     <v-for> 
  4.       <v-for /> 
  5.     </v-for> 
  6.   </v-for> 
  7. </App> 

可以看到,我們有幾個v-for組件,它們彼此嵌套在一起。最后一件事,我們需要停止遞歸

  1. <template> 
  2.   <div> 
  3.     {{ list[0] }} 
  4.     <v-for 
  5.       v-if="list.length > 1" 
  6.       :list="list.slice(1)" 
  7.     /> 
  8.   </div> 
  9. </template> 

最終,渲染完所有項后,我們需要停止遞歸操作。

(2) 遞歸嵌套的插槽

現在,組件可以正常工作,但是我們也希望它與作用域內插槽一起使用,因為這樣可以自定義渲染每個項的方式:

  1. <template> 
  2.   <v-for :list="list"> 
  3.     <template v-slot="{ item }"> 
  4.       <strong>{{ item }}</strong> 
  5.     </template> 
  6.   </v-for> 
  7. </template> 

(3) 嵌套插槽

一旦弄清楚了如何遞歸地嵌套插槽,就會對它癡迷一樣的感嘆:

  • 嵌套n級的插槽
  • 遞歸插槽
  • 包裝組件將一個插槽轉換為多個插槽

首先,我們將簡要介紹嵌套插槽的工作方式,然后介紹如何將它們合并到v-for組件中。

假設我們有三個組件:Parent、Child和Grandchild。我們希望傳遞來自Parent組件的一些內容,并在Grandchild組件中渲染它。

從Parent開始,我們傳遞一些內容:

  1. // Parent.vue 
  2. <template> 
  3.   <Child> 
  4.     <span>Never gonna give you up</span> 
  5.   </Child> 
  6. </template> 

我們在Child組件中做一些事情,將在稍后介紹。然后我們的Grandchild組件獲取插槽并渲染內容:

  1. // Grandchild.vue 
  2. <template> 
  3.   <div> 
  4.     <slot /> 
  5.   </div> 
  6. </template> 

那么,這個Child組件是什么樣的?

我們需要它從Parent組件獲取內容并將其提供給Grandchild組件,因此我們將兩個不同的插槽連接在一起。

  1. // Child.vue 
  2. <template> 
  3.   <Grandchild> 
  4.     <slot /> 
  5.   </Grandchild> 
  6. </template> 

請記住,元素渲染出作為插槽傳遞到組件的內容。因此,我們將從“Parent”中獲取該內容,然后將其渲染到“Grandchild”插槽中。

(4) 添加作用域插槽

與嵌套作用域插槽唯一不同的是,我們還必須傳遞作用域數據。將其添加到v-for中,我們現在得到以下信息:

  1. <template> 
  2.   <div> 
  3.     <slot v-bind:item="list[0]"> 
  4.       <!-- Default --> 
  5.       {{ list[0] }} 
  6.     </slot> 
  7.     <v-for 
  8.       v-if="list.length > 1" 
  9.       :list="list.slice(1)" 
  10.     > 
  11.       <!-- Recursively pass down scoped slot --> 
  12.       <template v-slot="{ item }"> 
  13.         <slot v-bind:item="item" /> 
  14.       </template> 
  15.     </v-for> 
  16.   </div> 
  17. </template> 

首先讓我們看一下基本情況。

如果沒有提供插槽,則默認元素內部的內容,并像以前一樣渲染list[0]。但是如果我們提供了一個slot,它會將其渲染出來,并通過slot作用域將列表項傳遞給父組件。

這里的遞歸情況類似。如果我們將插槽傳遞給v-for,它將在下一個v-for的插槽中進行渲染,因此我們得到了嵌套。它還從作用域槽中獲取item并將其傳遞回鏈。

現在,我們這個組件僅使用template就能實現 v-for效果。

總結

我們做了很多事情,終于了解了如何創建一個僅使用 template 就能實現v-for的效果。

本文主要內容:

  • 遞歸地表示列表
  • 遞歸組件
  • 嵌套槽和嵌套作用域槽

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2021-04-14 07:52:00

Vue 作用域插槽

2021-05-08 07:37:32

Vue 命名插槽

2020-08-10 08:30:35

Vue 數據插槽

2019-10-15 09:05:07

域插槽組件前端

2024-06-03 10:00:51

Vue 3語法插槽

2025-03-07 10:10:48

Vue插槽slot

2021-12-29 07:51:21

Vue3 插件Vue應用

2021-09-03 08:23:21

Vue 插槽子組件

2022-07-15 08:45:07

slotVue3

2021-11-26 10:08:57

鴻蒙HarmonyOS應用

2023-11-06 07:37:01

函數式插槽React

2020-03-24 08:32:24

vue作用域前端

2022-09-21 11:45:22

Vue組件插槽函數

2022-09-22 08:45:10

Vue組件函數

2021-09-27 09:04:40

Vue.js代碼庫開發人員

2023-09-05 08:23:56

SpringScope方法

2022-11-29 17:38:57

DockerfileARG作用域

2012-02-16 10:51:39

AMDOpteron皓龍處理服務器

2013-01-06 10:18:40

英特爾Haswell插槽

2010-06-04 15:30:44

Linux 查看內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 涩涩视频在线观看 | 亚洲国产精品久久 | 91精品国产综合久久久动漫日韩 | 国内自拍偷拍 | 亚洲精品欧美 | 91精品国产92| 在线观看国产视频 | 日韩欧美在线免费观看视频 | 九九九久久国产免费 | 久久久久中文字幕 | 日韩一区精品 | 久久中文字幕一区 | 久久999| 国产91精品在线 | 一级黄色片美国 | 久久精品免费观看 | 国产九一精品 | 日日操视频 | 国产视频综合 | 91亚洲国产亚洲国产 | 国产乱码精品一品二品 | 亚洲精品国产一区 | 亚洲成人一区二区三区 | 亚洲国产成人精品女人久久久野战 | 黄色骚片 | 国产蜜臀 | 午夜在线影院 | 国产精品久久久久久亚洲调教 | 亚洲国产精品久久久久婷婷老年 | 国产高清精品在线 | 久久久国产精品网站 | 日韩中文字幕一区 | 国产精品99久久免费观看 | 亚洲精品资源 | 亚洲视频网 | 亚洲日产精品 | 欧美午夜视频 | 日日综合| 日本精品一区二区三区视频 | 中文字幕在线观看一区 | 免费看片国产 |