欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從組件封裝看Vue的作用域插槽的實現(xiàn)

 更新時間:2019年02月12日 09:44:21   作者:huangzhi''s blog  
這篇文章主要介紹了從組件封裝看Vue的作用域插槽的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

作用域插槽不是那么直觀的一個概念。Vue文檔使用了一段描述性的話來解釋作用域插槽:

有的時候你希望提供的組件帶有一個可從子組件獲取數(shù)據(jù)的可復用的插槽
……
但是在我們應用的某些部分,我們希望每個獨立的待辦項渲染出和 todo.text 不太一樣的東西。這也是作用域插槽的用武之地。

但在我看來,至少是第一次讀到的時候,這段話相當不好理解。插槽不是分發(fā)內容到子組件嗎,為什么還要從子組件中獲取數(shù)據(jù)?不是已經有了通過emit事件的方法從子組件向父組件傳遞數(shù)據(jù)嗎,為什么需要它?作用域插槽到底是來干嘛的?……

在瀏覽了不少博客、自己思考“如果不這么做,就會怎么樣”再動手實踐之后,作用域插槽的含義才逐漸明了。其實作用域插槽提供了一種封裝可復用組件的新思路。下面我會從最簡單的例子開始。

簡單的展示列表

現(xiàn)在我們做一個純展示用途的列表組件,如下圖所示:

第一個例子先用slot來分發(fā)內容

<template>
 <div class="list">
  <div class="list-title">
   <slot name="title"></slot>
  </div>
  <div class="list-content">
   <slot name="content"></slot>
  </div>
 </div>
</template>

<script>
 export default {
  name: "MyList"
 }
</script>

在父組件中使用MyList

<template>
 <MyList>
  <span slot="title">title</span>
  <ul slot="content">
   <li v-for="item in listData">{{item}}</li>
  </ul>
 </MyList>
</template>

<script>
 import myList from './List.vue';
 export default {
  name: 'HelloWorld',
  components: {
   'MyList': myList
  },
  data() {
   return {
    listData: [
      '列表項1',
      '列表項2',
      '列表項3'
    ]
   }
  }
 }
</script>

省略了其中的樣式代碼,結果如圖所示

滿足了基本的需求,但是作為組件的使用者,這樣的一個組件會讓我覺得非常麻煩,content中循環(huán)的邏輯還需要我自己動手來寫,這樣的使用毫無便利性。于是有了下面第二個版本

使用prop來傳遞數(shù)據(jù)

因為考慮到列表的內容總是一個數(shù)組,我把循環(huán)結構寫進了組件中

列表組件第二版:

<template>
 <div class="list">
  <div class="list-title">{{title}}</div>
  <ul class="list-content">
   <li v-for="(item ,index) in content" :key="index">{{item}}</li>
  </ul>
 </div>
</template>

<script>
 export default {
  name: "MyList",
  props: {
   title: {
    type: String,
    required: true
   },
   content: {
    type: Array,
    required: true
   }
  }
 }
</script>

使用起來也非常方便,只需通過prop將數(shù)據(jù)傳入組件中

<template>
 <div>
  <MyList title="標題1" :content="listData"></MyList>
  <MyList title="標題2" :content="newListData"></MyList>
 </div>
</template>

<script>
 import myList from './List.vue';
 export default {
  name: 'HelloWorld',
  components: {
   'MyList': myList
  },
  data() {
   return {
    listData: [
      '列表項1',
      '列表項2',
      '列表項3'
    ],
    newListData: [
      '新的列表項1',
      '新的列表項2',
      '新的列表項3'
    ],
   }
  }
 }
</script>

改進之后,每當我使用組件只需一行代碼,大大簡化了工作量

易用性的需求也滿足了,但現(xiàn)在又有了新的問題,組件的拓展性不好!每次只能生成相同結構的列表,一旦業(yè)務需求發(fā)生了變化,組件就不再適用了。比如我現(xiàn)在有了新的需求,在一個列表的每個列表項前加入了一個小logo,我總不可能又寫一個新的組件來適應需求的變化吧?假如需要更多的定制化場景呢?

作用域插槽

這里就有了第三版的列表組件,使用作用域插槽將子組件中的數(shù)據(jù)傳遞出去 

<template>
 <div class="list">
  <div class="list-title">{{title}}</div>
  <ul class="list-content">
   <li v-for="(item ,index) in content" :key="index">
    <!--這里將content中的每一項數(shù)據(jù)綁定到slot的item變量上,在父組件中可以獲取到item變量-->
    <slot :item="item">{{item}}</slot>
   </li>
  </ul>
 </div>
</template>

使用組件時,將業(yè)務所需的content模板傳入

<template>
 <div>
  <MyList title="標題1" :content="listData1"></MyList>
  <MyList title="標題2" :content="listData2">
   <template slot-scope="scope">
    <img :src="scope.item.img" width="20">
    <span>{{scope.item.text}}</span>
   </template>
  </MyList>
  <MyList title="標題3" :content="listData3">
   <template slot-scope="scope">
    <b>{{scope.item.prefix ? '有前綴' : '無前綴'}}</b>
    <span>{{scope.item.text}}</span>
    <span>{{scope.item.remark}}</span>
   </template>
  </MyList>
 </div>
</template>

<script>
 import myList from './List.vue';

 export default {
  name: 'HelloWorld',
  components: {
   'MyList': myList
  },
  data() {
   return {
    listData1: [
     '列表項1',
     '列表項2',
     '列表項3'
    ],
    listData2: [
     {text: '第二個列表的列表項1', img: 'example.png'},
     {text: '第二個列表的列表項2', img: 'example.png'},
     {text: '第二個列表的列表項3', img: 'example.png'}
    ],
    listData3: [
     {text: '第三個列表的列表項1', prefix: true, remark: '附加的備注1'},
     {text: '第三個列表的列表項2', prefix: false, remark: '附加的備注2'},
     {text: '第三個列表的列表項3', prefix: true, remark: '附加的備注3'}
    ],
   }
  }
 }
</script>

實現(xiàn)了定制化的列表

再回到開始的問題,作用域插槽到底是干嘛用的?很顯然,它的作用就如官網(wǎng)所說的一樣:將組件的數(shù)據(jù)暴露出去。而這么做,給了組件的使用者根據(jù)數(shù)據(jù)定制模板的機會,組件不再是寫死成一種特定的結構。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 在Vue中解決跨域問題的常用方式

    在Vue中解決跨域問題的常用方式

    跨域問題是由瀏覽器引起的安全限制,而不是Vue框架本身導致的,Vue本身并不限制跨域訪問,它只是一個前端框架,負責構建用戶界面和處理數(shù)據(jù)邏輯,本文給大家介紹了在Vue中解決跨域問題的常用方式,需要的朋友可以參考下
    2023-10-10
  • vue配置文件自動生成路由和菜單實例代碼

    vue配置文件自動生成路由和菜單實例代碼

    因為不同的用戶有不同的權限,能訪問的頁面是不一樣的,所以我們在寫后臺管理系統(tǒng)時就會遇過這樣的需求:根據(jù)后臺數(shù)據(jù)動態(tài)添加路由和菜單,這篇文章主要給大家介紹了關于vue配置文件自動生成路由和菜單的相關資料,需要的朋友可以參考下
    2021-08-08
  • Vue3+echarts繪制世界地圖的示例代碼

    Vue3+echarts繪制世界地圖的示例代碼

    最近做項目需要實現(xiàn)世界地圖,本文主要介紹了Vue3+echarts繪制世界地圖的示例代碼,具有一定的參考價值,感謝的可以了解一下
    2024-03-03
  • 詳解Vue中組件的緩存

    詳解Vue中組件的緩存

    這篇文章主要介紹了Vue中組件的緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • vue DatePicker日期選擇器時差8小時問題

    vue DatePicker日期選擇器時差8小時問題

    這篇文章主要介紹了vue DatePicker日期選擇器時差8小時問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue兩個同級組件傳值實現(xiàn)

    Vue兩個同級組件傳值實現(xiàn)

    Vue組件之間是有聯(lián)系的,避免不了組件之間要互相傳值,那么如何實現(xiàn)Vue兩個同級組件傳值,本文就來介紹一下,感興趣的可以了解一下
    2021-07-07
  • 基于elementUI豎向表格、和并列的案例

    基于elementUI豎向表格、和并列的案例

    這篇文章主要介紹了基于elementUI豎向表格、和并列的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue Steps步驟條渲染異常問題

    Vue Steps步驟條渲染異常問題

    這篇文章主要介紹了Vue Steps步驟條渲染異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • vue element后臺鑒權流程分析

    vue element后臺鑒權流程分析

    這篇文章主要介紹了vue element后臺鑒權流程分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • vue自定義標簽和單頁面多路由的實現(xiàn)代碼

    vue自定義標簽和單頁面多路由的實現(xiàn)代碼

    這篇文章主要介紹了vue自定義標簽和單頁面多路由的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05

最新評論