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.mzph.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,…