Vue在渲染函數createELement和JSX中使用插槽slot

Vue對于插槽有兩個專門的APIvm.$slotsvm.$scopedSlots,分別是普通插槽和作用域插槽,使用JSX語法或渲染函數的時候,定義插槽將使用上述兩個API。

渲染函數createElement

普通插槽和作用域插槽在定義上相差不大,但是在使用方法上略微有點區別,詳見渲染函數>數據對象

普通插槽,插槽內容以children子節點形式,然后在數據對象中指定插槽名

// 定義帶插槽的組件,`$slots.default`為匿名插槽,其余的則是具名插槽,匿名插槽的插槽名可以省略
const MySlot = {render (h) {return h('div', [h('header', [this.$slots.header]),h('main', [this.$slots.header]),h('footer', [this.$slots.footer])])}
}// 在`children子節點`中指定插槽名以使用具名插槽,未指定插槽名的則放入匿名插槽中
export default {components: { MySlot },render (h) {return h('MySlot', [h('template', { slot: 'header' }, 'hello world'),'children node',h('div', { slot: 'footer' }, 'this is footer')])}
}

作用域插槽,與普通插槽不同,作用域插槽的內容直接放入渲染函數的數據對象中的

// 定義作用域插槽
const MySlot = {data () {return { user: 'John', content: 'vue', copytight: 'CopyRight' }},render (h) {return h('div', [h('header', [this.$scopedSlots.header({ user: this.user })]),h('main', [this.$scopedSlots.default({ content: this.content })]),h('footer', [this.$scopedSlots.footer({ copytight: this.copytight })])])}
}// 要使用作用域插槽的數據內容,則插槽必須在組件的數據對象`scopedSlots`中使用,如`header`所示
// 作用域插槽也可以當作普通插槽使用,如`default`和`footer`
export default {components: { MySlot },render (h) {return h('MySlot', {scopedSlots: {header: props => `hello, ${props.user}`}}, ['children node',h('div', { slot: 'footer' }, 'this is footer')])}
}

關于靜態插槽和作用域插槽:

你可以通過 this.$slots 訪問靜態插槽的內容,每個插槽都是一個 VNode 數組
也可以通過 this.$scopedSlots 訪問作用域插槽,每個作用域插槽都是一個返回若干 VNode 的函數

this.$slots 返回的是數組,this.$scopedSlots 返回的是函數,這里踩一個坑,使用 this.$scopedSlots 定義的插槽如果未被使用則會報錯

例如刪除或注釋掉具名插槽footer內容后,控制臺報錯

[Vue warn]: Error in render: "TypeError: this.$scopedSlots.footer is not a function"

如何避免這個問題暫時沒有找到解決方案,研究還不夠深入


2021年1月25日補充:

使用 this.$scopedSlots 定義的插槽如果未被使用則會報錯

原因: 以footer插槽為例,其實不用想的太復雜,作用域插槽this.$scopedSlots.footer()就是一個函數,MySlot組件使用了這個函數,但是父組件卻沒有傳入此函數的定義,所以MySlot再調用這個函數的時候發生報錯。
解決辦法:MySlot調用this.$scopedSlots.footer()前進行一次判斷此函數是否存在即可。


JSX語法

JSX是createElement的語法糖,在用法上沒有什么區別,對照著上面的內容稍微改一改就好了

靜態插槽

const MySlot = {render (h) {return (<div><header>{this.$slots.header}</header><main>{this.$slots.default}</main><footer>{this.$slots.footer}</footer></div>)}
}export default {render (h) {return (<MySlot><template slot='header'>hello world</template>children node<div slot='footer'>this is footer</div></MySlot>)}
}

作用域插槽

const MySlot = {data () {return { user: 'John', content: 'vue', copytight: 'CopyRight' }},render (h) {return (<div><header>{this.$scopedSlots.header({ user: this.user })}</header><main>{this.$scopedSlots.default({ content: this.content })}</main><footer>{this.$scopedSlots.footer({ copytight: this.copytight })}</footer></div>)}
}export default {render (h) {return (<MySlotscopedSlots={{header: props => `hello, ${props.user}`}}>children node<div slot='footer'>this is footer</div></MySlot>)}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281215.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281215.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281215.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET Conf China 2022 第一批講師陣容大揭秘!整個期待了!

目光看過來2022年12月3-4日一場社區性質的國內規模最大的線上線下.NET Conf 2022技術大會即將盛大開幕目前大會正緊鑼密鼓地進行中第一批大咖講師及主題已確定小編迫不及待想和大家分享分享嘉賓很大咖分享內容很硬核戳戳小手期待ing孔令磊維宏股份 首席架構師 十多年數控領域研…

2017 Material design 第二章第六節《富有創造性的定制方案》

六、富有創造性的定制方案&#xff08;Creative customization&#xff09; 動效可以應用于不同的對象尺寸和不同的環境&#xff0c;這有助于設計美感和功能的統一。 icon的類型系統icons可以有雙重功能。 產品icons應該設計得精致、美觀。 Icons 系統icons一個系統icon也許存在…

(十四)Java springcloud B2B2C o2o多用戶商城 springcloud架構- Spring Cloud構建分布式電子商務平臺...

通過Spring Cloud構建PC微信APP云服務的云商平臺系統&#xff0c;其中包括B2B、B2C、C2C、O2O、新零售、直播電商等子平臺&#xff0c;之前我們講了很多關于Spring Cloud的概念文章&#xff0c;從本節開始&#xff0c;我們會以分布式微服務電子商務平臺為案例&#xff0c;逐步給…

C# 隊列(Queue)

概述隊列&#xff08;Queue&#xff09;代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時&#xff0c;則使用隊列。當您在列表中添加一項&#xff0c;稱為入隊&#xff0c;當您從列表中移除一項時&#xff0c;稱為出隊。Queue 類的方法和屬性Count 獲取 Queu…

vue完全編程方式與react在書寫和運用上的異同

在構建html元素時&#xff0c;vue傾向于模板方式&#xff0c;而react則完全使用javascript的編程能力&#xff0c;但vue也具備完全編程的能力&#xff08;與react一樣使用JSX和createElement渲染函數&#xff09;。所以&#xff0c;當vue使用完全編程方式時&#xff0c;與react…

Solr 配置文件之schema.xml

schema.xml這個配置文件的根本目的是為了通過配置告訴Solr怎樣建立索引。solr的數據結構例如以下&#xff1a;document&#xff1a;一個文檔、一條記錄 field&#xff1a;域、屬性solr通過搜索某個或某些field&#xff0c;返回若干個符合條件的document。或者按搜索的score排序…

wget整站抓取、網站抓取功能;下載整個網站;下載網站到本地

wget -r -p -np -k -E http://www.xxx.com 抓取整站 wget -l 1 -p -np -k http://www.xxx.com 抓取第一級 -r 遞歸抓取-k 抓取之后修正鏈接&#xff0c;適合本地瀏覽 http://blog.sina.com.cn/s/blog_669fb0c3010137bq.html wget -m -e robotsoff -k -E "http://…

Git標簽tag及tag遠程同步

Git給某個歷史版本打上標簽&#xff0c;這樣我們可以快速的眾多歷史版本中找到自己需要的版本&#xff0c;一般打標簽的版本都是發布版本&#xff0c;例如v1.0.0 標簽操作 創建標簽 # 輕量標簽 git tag tagname eg: git tag v1.4# 附注標簽 git tag -a tagname -m tag descr…

妙用SQL Server聚合函數和子查詢迭代求和

先看看下面的表和其中的數據&#xff1a;t_product該表有兩個字段&#xff1a;xh和price&#xff0c; 其中xh是主索引字段&#xff0c;現在要得到如下的查詢結果&#xff1a;從上面的查詢結果可以看出&#xff0c;totalprice字段值的規則是從第1條記錄到當前記錄的price之和。如…

記一次.NET某工控圖片上傳CPU爆高分析

一&#xff1a;背景 1.講故事今天給大家帶來一個入門級的 CPU 爆高案例&#xff0c;前段時間有位朋友找到我&#xff0c;說他的程序間歇性的 CPU 爆高&#xff0c;不知道是啥情況&#xff0c;讓我幫忙看下&#xff0c;既然找到我&#xff0c;那就用 WinDbg 看一下。二&#xff…

微信小程序項目實踐準備工作

微信小程序項目實踐準備工作一、了解微信小程序產品定位及功能介紹微信小程序是一種全新的連接用戶與服務的方式&#xff0c;它可以在微信內被便捷地獲取和傳播&#xff0c;同時具有出色的使用體驗。簡單的說&#xff0c;小程序是微信附屬產品&#xff0c;需要依賴微信&#xf…

VSCode 用戶自定義片段 snippet 基本語法說明

先上一個官方模板&#xff1a; "Print to console": {"prefix": "log","body": ["console.log($1);","$2"],"description": "Log output to console" }prefix 前綴&#xff0c;emmet 觸發條…

Python集合和函數

深淺拷貝&#xff1a;.copy()方法&#xff0c;淺拷貝值拷貝一層。列表中的列表和字典會深拷貝&#xff0c;其他類型會淺拷貝。列表中的列表和字典會隨著副本的修改而改變&#xff0c;其他類型不會隨著副本的改變為改變。ab不是復制&#xff0c;是兩個變量共享同一內存空間&…

從 WinDbg 角度理解 .NET7 的AOT玩法

一&#xff1a;背景 1.講故事前幾天 B 站上有位朋友讓我從高級調試的角度來解讀下 .NET7 新出來的 AOT&#xff0c;畢竟這東西是新的&#xff0c;所以這一篇我就簡單摸索一下。二&#xff1a;AOT 的幾個問題 1. 如何在 .NET7 中開啟 AOT 功能在 .NET7 中開啟 AOT 非常方便&…

.NET Core C#系列之XiaoFeng.ToCast萬能類型轉換器

數據類型相互轉換如&#xff1a;字符串轉整型&#xff0c;字符串轉日期首先要引用 XiaoFeng命名空間下邊三個擴展方法 就是類型轉換的方法最常用的就是 ToCast<T>方法/// <summary> /// 類型相互轉換 /// </summary> /// <typeparam name"T">…

利用 Git OpenSSH 查看/生成 本機 ssh 公鑰

查看本機公鑰 本機公鑰文件一般用戶目錄下的.ssh文件夾&#xff0c;文件夾下有三個文件&#xff0c;分別是 id_rsa 私鑰密碼id_rsa.pub 公鑰內容known_hosts 允許的host地址 使用文本編輯器查看文件id_rsa.pub文件即可 或者使用cat命令查看 # 任意位置打開 Git bash cd ~/.…

高斯消元法

有點線代的知識&#xff1a; const double EPS 1e-8; typedef vector<double> vec; typedef vector<vec> mat; //Ax b vec gauss_jordan(const mat &A, const vec &b) {int n A.size();mat B(n,vec(n1)); //定義大小for(int i0;i < n;i)for(int j0…

判斷對象是否存在某個屬性

JavaScript判斷對象是否存在某個屬性或者方法&#xff0c;常用方法有兩種hasOwnProperty和in hasOwnProperty是Object原型對象上的一個方法&#xff0c;用來判斷對象自身屬性中是否具有指定的屬性。 這個方法可以用來檢測一個對象是否含有特定的自身屬性&#xff1b;和 in 運…

【PPT】適配器模式 和 橋接模式

【PPT】適配器模式 和 橋接模式目錄【PPT】適配器模式 和 橋接模式一、PPT 截圖1.0、封面和目錄1.1、設計模式概述1.2、結構型模式特點1.3、適配器模式1.4、橋接模式二、參考資料及 PPT 獲取方法獨立觀察員 2022 年 11 月 15 日為之前公司準備的分享PPT&#xff0c;后來沒用上。…

Flask 【第七篇】Flask中的wtforms使用

一、簡單介紹flask中的wtforms WTForms是一個支持多個web框架的form組件&#xff0c;主要用于對用戶請求數據進行驗證。 安裝&#xff1a; pip3 install wtforms 二、簡單使用wtforms組件 1、用戶登錄 具體代碼&#xff1a; from flask import Flask,render_template,request,…