【Vue】理解<slot>插槽及其slot、slot-scope、v-slot指令的使用
Vue 理解 及其 指令 Scope slot 插槽 使用
2023-09-11 14:14:50 时间
什么是插槽
Vue本身实现了一套完善的内容分发的机制,使用元素作为内容分发的出口,也就是插槽。插槽内的模板、HTML代码以及组件会被渲染。
<!-- Example组件的定义 -->
<h1>
<slot></slot>
</h1>
<Child>
<p>我是插槽内容</p>
</Child>
如果组件本身没有元素作为出口,那么组件包含的内容都会被舍弃
<!-- Example组件的定义 -->
<h1></h1>
<Child>
<!-- 被舍弃,不渲染 -->
<p>我是插槽内容</p>
</Child>
默认插槽/匿名插槽(default slot)
上面例子中的没有显式声明name属性,就是默认插槽,其name的属性值默认为‘default’。如果向插槽传入数据时没有指明插槽名,就会传入默认插槽
具名插槽
具名插槽就是带有name属性的。在很多情况下,需要向多个插槽传入内容,此时就需要用到具名插槽。
作用域插槽
有时父组件需要访问插槽里的作用域,此时可以通过作用域插槽(v-slot和slot-scope)访问插槽的作用域对象,它由插槽上定义的特性值组成。
插槽默认值(后备内容)
<!-- Example组件的定义 -->
<h1>
<slot>我是默认值</slot>
</h1>
<!-- 会渲染成<h1>我是默认值</h1> -->
<Child>
</Child>
<!-- 会渲染成<h1><p>我是新内容</p></h1> -->
<Child>
<p>我是新内容</p>
</Child>
slot和slot-scope(3.0版本之后移除),可以通过vue-V查看vue版本
slot用于绑定传入内容的插槽,slot-scope获取插槽的作用域对象
v-slot(2.6版本之后加入)
结合上述两个指令的新指令:
- v-slot:slotName绑定传入的插槽,缩写为#slotName 等价于slot=“slotName”
- v-slot:slotName=“scope”,获取插槽的作用域对象并赋值给scope,等价于slot-scope=“scope”。同时可以使用ES6的解构语法获取指定的特性v-slot=“{
footer }” - 当插槽为默认插槽时,v-slot可以不带修饰符,直接在组件上使用,并且将默认插槽的作用域赋给v-slot声明的变量
- 最重要的一个特性就是可以直接在组件上声明获取插槽组件的作用域对象
slot-scope与v-slot的新老指令的使用对比
1. 默认文本插槽
<!-- 默认文本插槽 -->
<!-- old -->
<foo>
<template slot-scope="{ msg }">
{{ msg }}
</template>
</foo>
<!-- new -->
<foo v-slot="{ msg }">
{{ msg }}
</foo>
2. 默认元素插槽
<!-- 默认元素插槽 -->
<!-- old -->
<foo>
<div slot-scope="{ msg }">
{{ msg }}
</div>
</foo>
<!-- new -->
<foo v-slot="{ msg }">
<div>
{{ msg }}
</div>
</foo>
3. 嵌套默认插槽
<!-- 嵌套默认插槽 -->
<!-- old -->
<foo>
<bar slot-scope="foo">
<baz slot-scope="bar">
<template slot-scope="baz">
{{ foo }} {{ bar }} {{ baz }}
</template>
</baz>
</bar>
</foo>
<!-- new -->
<foo v-slot="foo">
<bar v-slot="bar">
<baz v-slot="baz">
{{ foo }} {{ bar }} {{ baz }}
</baz>
</bar>
</foo>
4. 具名插槽
<!-- 具名插槽 -->
<!-- old -->
<foo>
<template slot="one" slot-scope="{ msg }">
text slot: {{ msg }}
</template>
<div slot="two" slot-scope="{ msg }">
element slot: {{ msg }}
</div>
</foo>
<!-- new -->
<foo>
<template v-slot:one="{ msg }">
text slot: {{ msg }}
</template>
<template v-slot:two="{ msg }">
<div>
element slot: {{ msg }}
</div>
</template>
</foo>
5. 具名与默认混合嵌套插槽
<!-- 具名与默认混合嵌套插槽 -->
<!-- old -->
<foo>
<bar slot="one" slot-scope="one">
<div slot-scope="bar">
{{ one }} {{ bar }}
</div>
</bar>
<bar slot="two" slot-scope="two">
<div slot-scope="bar">
{{ two }} {{ bar }}
</div>
</bar>
</foo>
<!-- new -->
<foo>
<template v-slot:one="one">
<bar v-slot="bar">
<div>{{ one }} {{ bar }}</div>
</bar>
</template>
<template v-slot:two="two">
<bar v-slot="bar">
<div>{{ two }} {{ bar }}</div>
</bar>
</template>
</foo>
帮助理解
相关文章
- [转] vue自定义组件(通过Vue.use()来使用)即install的使用
- vue - config
- vue-property-decorator 提供 OO 的风格 Vue Component 方便类型声明
- Vue - Redirected when going from “/login?redirect=%2Fdashboard“ to “/dashboard“ via a navigation
- Java项目(前端vue后台java微服务)在线考试系统(java+vue+springboot+mysql+maven)
- vue引入百度地图并渲染坐标点(简单直接)
- vue重复点击路由 导致冗余导航的解决方法
- Vue绑定事件,双向数据绑定,只是循环没那么简单
- vue 实践技巧合集
- 后台(一)vue+element-ui (按需加载)
- Vue的elementUI实现自定义主题
- 用 vue cli 脚手架搭建单页面 Vue 应用(进阶2)
- vue去掉严格开发,即去掉vue-cli安装时的eslint
- 【Vue】vue基础语法——computed计算、watch监听、class和style,最后回顾JavaScript里面的常用方法(vue学习day03)
- vue学习笔记六:Jquery VS Vue之网络请求明细对照
- 【毕业设计/课程设计】基于Vue的在线聊天系统
- 浅谈vue中插件的使用方法Vue.use(xxx),原理及实现
- vue中单选框与多选框的实现与美化
- 理解Vue的状态管理模式Vuex
- Vue.js中 watch的理解以及深度监听
- Vue经典实例之可编辑的表格table(史上最简单方便的处理方式,比用element容易理解),同时处理input获取焦点的问题!不好用你找我
- 【VUE】vue配置Gzip压缩
- antd design vue 时间选择器设置默认时间