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

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

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

$scopedSlots(作用域插槽)

定義:子組件提供數(shù)據(jù),父組件決定如何渲染,數(shù)據(jù)作用域?qū)儆谧咏M件。

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

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

$slots(普通插槽)

定義:父組件提供內(nèi)容,子組件決定在哪里渲染,數(shù)據(jù)作用域?qū)儆诟附M件。

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

// 普通插槽的本質(zhì):父組件編譯好的 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>
    <!-- 普通插槽:直接渲染父組件傳來的內(nèi)容 -->
    <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() {
  // 子組件調(diào)用這個函數(shù),傳入自己的數(shù)據(jù)
  const vnode = this.$scopedSlots.default({ message: this.childMessage })
  return vnode
}

總結(jié)對比表

維度普通插槽作用域插槽
數(shù)據(jù)來源父組件子組件
存儲形式VNode數(shù)組函數(shù)
編譯時機父組件編譯時子組件運行時調(diào)用
使用場景布局、內(nèi)容填充自定義渲染,列表渲染
靈活性低(內(nèi)容固定)高(可動態(tài)渲染)
數(shù)據(jù)流向父 → 子(僅傳遞內(nèi)容)子 → 父 (僅傳遞數(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'
  // 調(diào)用函數(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'
調(diào)用方式普通插槽直接使用,作用域插槽需調(diào)用所有插槽都需調(diào)用

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

相關(guān)文章

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

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

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

    vue中關(guān)于checkbox使用的問題

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

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

    我們在使用vue 腳手架時,為了規(guī)范團隊的代碼格式,會有一個代碼規(guī)范檢測,如果不符合規(guī)范就會報錯,有時候我們不想按照他的規(guī)范去寫。這時我們需要關(guān)閉,這里腳本之家小編給大家?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ù)字的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • vue3+elementui-plus實現(xiàn)無限遞歸菜單示例代碼

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

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

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

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

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

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

最新評論

商丘市| 保康县| 株洲县| 西安市| 玛多县| 安多县| 成都市| 上犹县| 改则县| 平凉市| 江川县| 庆云县| 公主岭市| 镶黄旗| 吉木萨尔县| 扎囊县| 寻乌县| 牙克石市| 离岛区| 栾川县| 元氏县| 苍溪县| 四子王旗| 毕节市| 喀喇沁旗| 蓬安县| 黄浦区| 玉溪市| 普兰店市| 绵竹市| 开原市| 宜城市| 达州市| 景东| 正镶白旗| 峨眉山市| 阳曲县| 定南县| 舞阳县| 武宣县| 得荣县|