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

Vue2、Vue3中的$scopedSlots和$slots區(qū)別小結

 更新時間:2026年03月31日 08:37:44   作者:假裝沒有名字  
本文主要介紹了Vue2、Vue3中的$scopedSlots和$slots區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

$scopedSlots(作用域插槽)

定義:子組件提供數(shù)據(jù),父組件決定如何渲染,數(shù)據(jù)作用域屬于子組件。

本質:子組件不直接渲染內容,而是接收一個函數(shù),這個函數(shù)在子組件作用域內執(zhí)行,從而讓父組件的模板可以訪問子組件的數(shù)據(jù)。

// 作用域插槽的本質:一個函數(shù),子組件調用時傳入數(shù)據(jù)
this.$scopedSlots.default = function(data) {
  // 這個函數(shù)在父組件的作用域編譯
  // 但參數(shù) data 來自子組件
  return VNode  // 返回渲染好的節(jié)點
}

$slots(普通插槽)

定義:父組件提供內容,子組件決定在哪里渲染,數(shù)據(jù)作用域屬于父組件。

本質:父組件在編譯時就已經(jīng)確定了插槽內容的所有數(shù)據(jù)和邏輯,子組件只是作為一個容器來擺放這些內容。

// 普通插槽的本質:父組件編譯好的 VNode 數(shù)組
// 子組件只是被動接收
this.$slots.default = [VNode, VNode, ...]  // 已經(jīng)是渲染好的節(jié)點

數(shù)據(jù)作用域的指向

<!-- 父組件 Parent.vue -->
<template>
  <div>
    <!-- 普通插槽 -->
    <ChildComponent>
      <div>{{ parentMessage }}</div>  <!-- ? 可以訪問父組件數(shù)據(jù) -->
      <!-- <div>{{ childMessage }}</div>  ? 不能訪問子組件數(shù)據(jù) -->
    </ChildComponent>
    <!-- 作用域插槽 -->
    <ChildComponent>
      <template v-slot:default="slotProps">
        <div>{{ parentMessage }}</div>  <!-- ? 可以訪問父組件數(shù)據(jù) -->
        <div>{{ slotProps.childMessage }}</div>  <!-- ? 可以訪問子組件數(shù)據(jù) -->
      </template>
    </ChildComponent>
  </div>
</template>
<script>
export default {
  data() {
    return {
      parentMessage: '父組件的數(shù)據(jù)'  // 父組件作用域
    }
  }
}
</script>
<!-- 子組件 ChildComponent.vue -->
<template>
  <div>
    <!-- 普通插槽:直接渲染父組件傳來的內容 -->
    <slot></slot>
    <!-- 作用域插槽:將子組件數(shù)據(jù)傳遞給父組件 -->
    <slot :childMessage="childMessage"></slot>
  </div>
</template>
<script>
export default {
  data() {
    return {
      childMessage: '子組件的數(shù)據(jù)'  // 子組件作用域
    }
  }
}
</script>

編譯時 vs 運行時

普通插槽:編譯時確定

// 父組件模板
<template>
  <child>
    <span>{{ message }}</span>  <!-- message 在編譯時就綁定到父組件 -->
  </child>
</template>
// 編譯后的渲染函數(shù)(簡化)
render() {
  // 在父組件作用域中創(chuàng)建 VNode
  const children = [createVNode('span', null, this.message)]
  // 傳遞給子組件
  return h(Child, null, { default: () => children })
}

作用域插槽:運行時確定

// 父組件模板
<template>
  <child>
    <template v-slot="props">
      <span>{{ props.message }}</span>  <!-- message 來自子組件 -->
    </template>
  </child>
</template>
// 編譯后的渲染函數(shù)(簡化)
render() {
  // 父組件不直接創(chuàng)建 VNode,而是創(chuàng)建一個函數(shù)
  const scopedSlotFn = (props) => {
    return createVNode('span', null, props.message)
  }
  // 把這個函數(shù)傳遞給子組件
  return h(Child, null, { default: scopedSlotFn })
}
// 子組件中
render() {
  // 子組件調用這個函數(shù),傳入自己的數(shù)據(jù)
  const vnode = this.$scopedSlots.default({ message: this.childMessage })
  return vnode
}

總結對比表

維度普通插槽作用域插槽
數(shù)據(jù)來源父組件子組件
存儲形式VNode數(shù)組函數(shù)
編譯時機父組件編譯時子組件運行時調用
使用場景布局、內容填充自定義渲染,列表渲染
靈活性低(內容固定)高(可動態(tài)渲染)
數(shù)據(jù)流向父 → 子(僅傳遞內容)子 → 父 (僅傳遞數(shù)據(jù))

vue3變化,scopedSlots被移除,統(tǒng)一使用scopedSlots被移除,統(tǒng)一使用scopedSlots被移除,統(tǒng)一使用slots,所有插槽都是函數(shù)。

<!-- 子組件 Child.vue -->
<template>
  <div>
    <!-- 普通插槽 -->
    <slot></slot>
    <!-- 作用域插槽 -->
    <slot name="item" :data="itemData"></slot>
  </div>
</template>
<script setup>
import { onMounted } from 'vue'
const itemData = { name: 'Vue 3', version: 3 }
onMounted(() => {
  // Vue 3 中,所有插槽都是函數(shù)
  console.log(typeof $slots.default)  // 'function'
  console.log(typeof $slots.item)     // 'function'
  // 調用函數(shù)獲取 VNode
  const defaultVNode = $slots.default()
  const itemVNode = $slots.item({ data: itemData })
  // 注意:Vue 3 中 $slots 返回的是 VNode 數(shù)組
  console.log(Array.isArray(defaultVNode))  // true
})
</script>
特性Vue 2Vue 3
普通插槽存儲$slots (VNode 數(shù)組)$slots (函數(shù))
作用域插槽存儲$scopedSlots (函數(shù))$slots (函數(shù))
模板語法slot + slot-scope統(tǒng)一 v-slot 或 #
訪問方式this.$slots / this.$scopedSlotsuseSlots() 或 $slots
類型判斷Array.isArray($slots.default)typeof $slots.default === 'function'
調用方式普通插槽直接使用,作用域插槽需調用所有插槽都需調用

到此這篇關于Vue2、Vue3中的$scopedSlots和$slots區(qū)別小結的文章就介紹到這了,更多相關Vue3中的$scopedSlots和$slots區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue關閉開發(fā)模式提示的簡單解決辦法

    vue關閉開發(fā)模式提示的簡單解決辦法

    Vue開發(fā)模式是一種基于Vue.js框架的開發(fā)方式,它可以幫助開發(fā)者更高效地構建和維護復雜的Web應用程序,下面這篇文章主要給大家介紹了關于vue關閉開發(fā)模式提示的簡單解決辦法,需要的朋友可以參考下
    2024-04-04
  • vue中關于checkbox使用的問題

    vue中關于checkbox使用的問題

    這篇文章主要介紹了vue中關于checkbox使用的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue resource發(fā)送請求的幾種方式

    vue resource發(fā)送請求的幾種方式

    這篇文章主要介紹了vue resource發(fā)送請求的幾種方式,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • vue?element-plus中el-input修改邊框border的方法

    vue?element-plus中el-input修改邊框border的方法

    element樣式還是蠻好的,只是有時候我們需要做一些調整,比如el-input的邊框,下面這篇文章主要給大家介紹了關于vue?element-plus中el-input修改邊框border的相關資料,需要的朋友可以參考下
    2022-09-09
  • 去掉vue 中的代碼規(guī)范檢測兩種方法(Eslint驗證)

    去掉vue 中的代碼規(guī)范檢測兩種方法(Eslint驗證)

    我們在使用vue 腳手架時,為了規(guī)范團隊的代碼格式,會有一個代碼規(guī)范檢測,如果不符合規(guī)范就會報錯,有時候我們不想按照他的規(guī)范去寫。這時我們需要關閉,這里腳本之家小編給大家?guī)砹巳サ魐ue 中的代碼規(guī)范檢測兩種方法(Eslint驗證),一起看看吧
    2018-03-03
  • vue-router+nginx 非根路徑配置方法

    vue-router+nginx 非根路徑配置方法

    這篇文章主要介紹了vue-router+nginx 非根路徑配置方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 淺談vue限制文本框輸入數(shù)字的正確姿勢

    淺談vue限制文本框輸入數(shù)字的正確姿勢

    這篇文章主要介紹了vue限制文本框輸入數(shù)字的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • vue3+elementui-plus實現(xiàn)無限遞歸菜單示例代碼

    vue3+elementui-plus實現(xiàn)無限遞歸菜單示例代碼

    這篇文章主要介紹了vue3+elementui-plus實現(xiàn)無限遞歸菜單,當一個組件的 key 值發(fā)生變化時,Vue 會認為這是一個新的組件實例,會強制重新創(chuàng)建和渲染這個組件,本文通過示例代碼詳細講解,需要的朋友可以參考下
    2024-04-04
  • proxy代理不生效以及vue?config.js不生效解決方法

    proxy代理不生效以及vue?config.js不生效解決方法

    在開發(fā)Vue項目過程中,使用了Proxy代理進行數(shù)據(jù)劫持,但是在實際運行過程中發(fā)現(xiàn)代理并沒有生效,也就是說數(shù)據(jù)并沒有被劫持,這篇文章主要給大家介紹了關于proxy代理不生效以及vue?config.js不生效解決方法的相關資料,需要的朋友可以參考下
    2023-11-11
  • vue使用vuedraggable插件實現(xiàn)拖拽效果

    vue使用vuedraggable插件實現(xiàn)拖拽效果

    這篇文章主要介紹了vue使用vuedraggable插件實現(xiàn)拖拽效果,本文分步驟介紹了安裝vuedraggable插件的方法及頁面引入的方法,需要的朋友可以參考下
    2024-04-04

最新評論

武宣县| 扬中市| 晋江市| 武威市| 安平县| 家居| 晋宁县| 乌拉特后旗| 贵德县| 沙河市| 合肥市| 巴林左旗| 通化市| 西乡县| 博罗县| 包头市| 蒙阴县| 红河县| 鄂伦春自治旗| 安达市| 松滋市| 潜江市| 太保市| 手机| 黑河市| 宜川县| 同心县| 卓资县| 南开区| 洪雅县| 卫辉市| 宜黄县| 平遥县| 三江| 白水县| 黑水县| 辉县市| 吴堡县| 延津县| 会东县| 宜君县|