最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決父子組件通信的三種Vue插槽

 更新時(shí)間:2021年11月23日 16:09:40   作者:Java云海.  
這篇文章主要為大家介紹了Vue插槽解決父子組件通信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

前言

插槽可以說(shuō)是 Vue 中非常重要的一部分吧,在我學(xué)習(xí)和練習(xí)的過(guò)程中,當(dāng)組件搭配著插槽一起使用的時(shí)候,會(huì)發(fā)揮的更好一些。更多時(shí)候也會(huì)更加方便。

今天介紹Vue中三種插槽吧:默認(rèn)插槽、具名插槽、作用域插槽。

環(huán)境準(zhǔn)備

先搭個(gè)初始環(huán)境給大家看看哈。一步一步講完這個(gè)插槽。

就是寫(xiě)了一個(gè)類別組件,分別渲染這三種數(shù)據(jù)。

image-20211120150949138

Category組件

<template>
  <div class="category">
    <h1>{{title}}</h1>
    <ul>
      <li 
      v-for="(item,index) in listData"
      :key="index">{{item}}</li>
    </ul>
  </div>
</template>
<script>
export default {
  props: {
    listData:Array,
    title: String
  }
}
</script>
<style scoped>
.category{
  width: 200px;
  height: 300px;
  background-color:pink;
}
</style>

App組件

<template>
  <div id="app">
    <Category :listData="games" :title="'Games'" />
    <Category :listData="movies" :title="'Movies'" />
    <Category :listData="foods" :title="'Foods'" />
  </div>
</template>
<script>
import Category from './components/Category.vue'
export default {
  name: 'App',
  components: {
    Category
  },
  data () {
    return {
      games:['穿越火線','qq飛車','洛克王國(guó)'],
      movies:['你好,李煥英','青春派','匆匆那年'],
      foods:['邵陽(yáng)米粉','長(zhǎng)沙茶顏','重慶火鍋']
    }
  }
}
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
  display: flex;
  justify-content: space-between;
}
</style>

最開(kāi)始就是如上圖一樣的需求,但是現(xiàn)在業(yè)務(wù)需求更改了,電影變成了只宣傳其中一個(gè),其他的不進(jìn)行宣傳,吃的也變成只宣傳一個(gè)拉。

如下圖:

image-20211120151432264

我們?cè)趺锤暮线m呢?

是在Category組件中加if一個(gè)個(gè)進(jìn)行判斷嗎?還是有更好的方法勒???

一個(gè)個(gè)判斷是不行的,那樣子代碼會(huì)變得十分繁雜,不易閱讀,萬(wàn)一以后又要更改業(yè)務(wù)需求,代碼都不好動(dòng)。

接下來(lái)就到默認(rèn)插槽的出現(xiàn)拉。

一、默認(rèn)插槽

我們?cè)谧咏M件中不用再用props 接收數(shù)據(jù),也不做渲染,而是定義一個(gè)插槽。

<template>
<div class="category">
    <!-- 定義插槽,插槽默認(rèn)內(nèi)容 -->
    <slot>如果當(dāng)父組件不傳值過(guò)來(lái),即顯示此默認(rèn)</slot>
    </div>
</template>
<script>
    export default {
        props: {
        }
    }
</script>

App組件也作出更改

<template>
<div id="app">
    <Category>
        <h1>Games</h1>
        <!-- <ul>
<li v-for="(item, index) in games" :key="index">{{ item }}</li>
    </ul> -->
        <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Fb352264fa7bfdb6d211f2e71e87cc2c48d85b805.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931135&t=0b2c6c622c84a1e387196cce8f50455e">
    </Category>
    
    <Category>
        <h1>Movies</h1>
        <img class="movies" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13236694597%2F641.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931502&t=f89c2197bda9bb129d9404d3c4b30f2f">
        <!-- <ul> -->
        <!-- <li v-for="(item, index) in movies" :key="index">{{ item }}</li> -->
        <!-- </ul> -->
    </Category>
    <Category>
        <h1>Foods</h1>
        <ul>
            <li v-for="(item, index) in foods" :key="index">{{ item }}</li>
    </ul>
    </Category>
    
    <!-- 當(dāng)我們什么都沒(méi)有寫(xiě)的時(shí)候,看展示什么 -->
    <Category>
    </Category>
    </div>
</template>
 
<script>
    import Category from './components/Category.vue'
 
    export default {
        name: 'App',
        components: {
            Category
        },
        data () {
            return {
                games:['穿越火線','qq飛車','洛克王國(guó)'],
                movies:['你好,李煥英','青春派','匆匆那年'],
                foods:['邵陽(yáng)米粉','長(zhǎng)沙茶顏','重慶火鍋']
            }
        }
    }
</script>

顯示效果:

image-20211120152024922

解釋:

我們?cè)谧咏M件寫(xiě)了一個(gè)<slot>如果當(dāng)父組件不傳值過(guò)來(lái),即顯示此默認(rèn)</slot> 標(biāo)簽,此處就相當(dāng)于占了一個(gè)位置。

我們?cè)诟附M件中,也不再像之前一樣<Category/>寫(xiě)自閉和標(biāo)簽,而是寫(xiě)了非自閉和標(biāo)簽<Category> 內(nèi)容 </Category>。這樣做,Vue就會(huì)默認(rèn)的將寫(xiě)在組件標(biāo)簽中的內(nèi)容渲染完,然后再放回子組件中的 <slot></slot> 占好位置的地方去。

注意:CSS樣式寫(xiě)在父組件或者子組件中都是可以的,因?yàn)樗卿秩就旰蟛欧呕刈咏M件中的。寫(xiě)在子組件中,就是在放回子組件中時(shí)渲染。

寫(xiě)完這里,客戶突然覺(jué)得你們這么厲害,不滿足啦,又開(kāi)始給你們整幺蛾子。

image-20211120152906020

接下來(lái)就又到具名插槽登場(chǎng)啦哈。

二、具名插槽

竟然我們能夠想到用一個(gè)插槽啦,那么為什么不能想著用兩個(gè)插槽來(lái)試一試?yán)眨?/p>

改造子組件

<template>
  <div class="category">
    <!-- 必須加上名稱 在父組件中才能指定要放入那個(gè)插槽 這也是為什么叫做具名插槽的原因--->
    <slot name="slot1">如果當(dāng)父組件不傳值過(guò)來(lái),即顯示此默認(rèn)</slot>
    <slot name="slot2"></slot>
  </div>
</template>
<script>
export default {
  props: {
  }
}
</script>

父組件

<template>
	<div id="app">
    	<Category>
       	 <template slot="slot1">
          	  <h1>Games</h1>
            <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Fb352264fa7bfdb6d211f2e71e87cc2c48d85b805.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931135&t=0b2c6c622c84a1e387196cce8f50455e"
                 />
	</template>
	<template slot="slot2">
		<button > qq登錄</button>
		<button > 微信登錄</button>
	</template>
 
</Category>
<Category>
    <template slot="slot1">
		<h1>Movies</h1>
			<img
     class="movies"
     src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13236694597%2F641.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639931502&t=f89c2197bda9bb129d9404d3c4b30f2f"
     />
    </template>
    <template slot="slot2">
		<button > 點(diǎn)擊購(gòu)票</button>
    </template>
</Category>
 
<Category>
    <template slot="slot1">
		<h1>Foods</h1>
		<ul>
    		<li v-for="(item, index) in foods" :key="index">{{ item }}</li>
        </ul>
    </template>
</Category>
 
<!-- 當(dāng)我們什么都沒(méi)有寫(xiě)的時(shí)候,看展示什么 -->
<Category> </Category>
</div>
</template>
 
<script>
    import Category from './components/Category.vue'
 
    export default {
        name: 'App',
        components: {
            Category
        },
        data () {
            return {
                games:['穿越火線','qq飛車','洛克王國(guó)'],
                movies:['你好,李煥英','青春派','匆匆那年'],
                foods:['邵陽(yáng)米粉','長(zhǎng)沙茶顏','重慶火鍋']
            }
        }
    }
</script>

效果展示

image-20211120153500451

解釋:

我們可以在組件中放多個(gè)slot,但是多個(gè)的時(shí)候必須要給他們命名,另外父組件中也要進(jìn)行指定,這樣才不會(huì)放不進(jìn)去。

三、作用域插槽

作用域插槽和前面稍稍有點(diǎn)不同,之前都是數(shù)據(jù)在父組件中,而作用域插槽是數(shù)據(jù)在子組件中,反過(guò)來(lái)傳遞給父組件,讓父組件定義結(jié)構(gòu)進(jìn)行渲染。

改造的子組件

<template>
  <div class="category">
    <slot name="slot1">如果當(dāng)父組件不傳值過(guò)來(lái),即顯示此默認(rèn)</slot>
    <slot name="slot2" :foods="foods">如果當(dāng)父組件不傳值過(guò)來(lái),即顯示此默認(rèn)</slot>
  </div>
</template>
<script>
export default {
  data () {
    return{
      foods:['邵陽(yáng)米粉','長(zhǎng)沙茶顏','重慶火鍋']
    }
  }
}
</script>

父組件

<template>
  <div id="app">
    <Category>
      <template slot="slot1">
        <h1>Foods</h1>
      </template>
      <template slot="slot2" scope="listData">
        <!--如果不知道的 咱們可以輸出看看這是什么· {{listData}}  -->
        <ul>
          <li v-for="(item, index) in listData.foods" :key="index">
            {{ item }}
          </li>
        </ul>
      </template>
    </Category>
    <Category>
      <template slot="slot1">
        <h1>Foods</h1>
      </template>
      <template slot="slot2" scope="listData">
        <ol>
          <li v-for="(item, index) in listData.foods" :key="index">
            {{ item }}
          </li>
        </ol>
      </template>
    </Category>
    <Category>
      <template slot="slot1">
        <h1>Foods</h1>
      </template>
      <template slot="slot2" scope="listData">
          <h4 v-for="(item, index) in listData.foods" :key="index">
            {{ item }}
          </h4>
      </template>
    </Category>
    <Category>
      <template slot="slot1" scope="listData">	
{{listData}}
      </template>
    </Category>
  </div>
</template>
 
<script>
import Category from './components/Category.vue'
 
export default {
  name: 'App',
  components: {
    Category
  }
}
</script>

效果圖

image-20211120154438477

這種我在學(xué)習(xí)及練習(xí)過(guò)程中,并沒(méi)有想到哪些使用場(chǎng)景,但是在官網(wǎng)上有案例,我想它必定是有存在的理由,只是我的見(jiàn)識(shí)太少,而未能利用到而已。

解釋:

子組件中通過(guò):變量名="定義的數(shù)據(jù)" 向父組件傳值,父組件用 <template slot="slot2" scope="不用和子組件傳遞過(guò)來(lái)的名稱相同"> 接收,因?yàn)檫€要. 一層,才到

<template slot="slot2" scope="listData">
<!--如果不知道的 咱們可以輸出看看這是什么· {{listData}}  -->
<ul>
    <li v-for="(item, index) in listData.foods" :key="index">
        {{ item }}
    </li>
    </ul>
</template>

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • VUE中使用TypeScript裝飾器實(shí)現(xiàn)表單驗(yàn)證的全過(guò)程

    VUE中使用TypeScript裝飾器實(shí)現(xiàn)表單驗(yàn)證的全過(guò)程

    這篇文章主要給大家介紹了關(guān)于如何在VUE中使用TypeScript裝飾器實(shí)現(xiàn)表單驗(yàn)證的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • vue,angular,avalon這三種MVVM框架優(yōu)缺點(diǎn)

    vue,angular,avalon這三種MVVM框架優(yōu)缺點(diǎn)

    本文給大家具體分析了下vue,angular,avalon這三種MVVM框架優(yōu)缺點(diǎn),十分的細(xì)致全面,有需要的小伙伴可以參考下
    2016-04-04
  • 關(guān)于vue3默認(rèn)把所有onSomething當(dāng)作v-on事件綁定的思考

    關(guān)于vue3默認(rèn)把所有onSomething當(dāng)作v-on事件綁定的思考

    這篇文章主要介紹了關(guān)于vue3默認(rèn)把所有`onSomething`當(dāng)作`v-on`事件綁定的思考,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 聊聊vue 中的v-on參數(shù)問(wèn)題

    聊聊vue 中的v-on參數(shù)問(wèn)題

    這篇文章主要介紹了聊聊vue 中的v-on參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • vue組件通信傳值操作示例

    vue組件通信傳值操作示例

    這篇文章主要介紹了vue組件通信傳值操作,結(jié)合實(shí)例形式分析了vue.js父子組件通信及兄弟組件通信相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • Element-ui自定義table表頭、修改列標(biāo)題樣式、添加tooltip、:render-header使用

    Element-ui自定義table表頭、修改列標(biāo)題樣式、添加tooltip、:render-header使用

    這篇文章主要介紹了Element-ui自定義table表頭、修改列標(biāo)題樣式、添加tooltip、:render-header使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • axios實(shí)現(xiàn)文件上傳并獲取進(jìn)度

    axios實(shí)現(xiàn)文件上傳并獲取進(jìn)度

    這篇文章主要為大家詳細(xì)介紹了axios實(shí)現(xiàn)文件上傳并獲取進(jìn)度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • vue中三種調(diào)用接口的方法

    vue中三種調(diào)用接口的方法

    這篇文章主要介紹了vue中三種調(diào)用接口的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 談?wù)刅ue.js——vue-resource全攻略

    談?wù)刅ue.js——vue-resource全攻略

    本篇文章主要介紹了談?wù)刅ue.js——vue-resource全攻略,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • vue+elementUI中表格高亮或字體顏色改變操作

    vue+elementUI中表格高亮或字體顏色改變操作

    這篇文章主要介紹了vue+elementUI中表格高亮或字體顏色改變操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11

最新評(píng)論

道真| 三明市| 广宗县| 惠东县| 南平市| 牙克石市| 黔东| 广州市| 河津市| 安西县| 江川县| 延津县| 永昌县| 泗水县| 青铜峡市| 石泉县| 峡江县| 承德县| 汝州市| 锦屏县| 调兵山市| 汕尾市| 怀仁县| 南乐县| 什邡市| 刚察县| 黑河市| 休宁县| 青田县| 饶平县| 盐边县| 惠来县| 咸丰县| 年辖:市辖区| 保德县| 唐山市| 磴口县| 宁河县| 土默特左旗| 闽侯县| 长沙县|