网站首页 > 技术文章 正文
阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。
本篇文章成哥继续带大家来学习前端VUE教程,今天主要讲解VUE的插槽等相关知识点。下面我们就一起来学习该块内容吧!
01 简介
插槽就是子组件中的提供给父组件使用的一个占位标识符,用<slot></slot> 表示(),父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签,下面我们来看看具体示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>VUE基础教程</title>
<!-- 引用vue.js文件 -->
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<!--调用子组件-->
<Child>
<p style="color: red">插槽示例(本内容将会渲染至子组件slot位置处)</p>
</Child>
</div>
<script>
// 定义一个子组件Child,同时在其html内部增加<slot></slot>进行占位
var Child = {
data: function () {
return {
}
},
/*父组件在调用子组件时会把其在子组件标签的内容渲染进slot占位处*/
template: '<h4>我是子组件<slot></slot></h4>',
}
var vm = new Vue({
el: '#app', // dom的挂载点,这边将dom挂载到id为app的标签上
// 在 components 选项中定义你想要使用的组件
components: {
"Child": Child,
},
data: { // 数据对象
},
})
</script>
</body>
</html>
这时肯定有人疑惑如果我子组件中没有slot标签然后再父组件中调用子组件时也在期内写上内容会不会被渲染了,我们来看一下演示:
现在可以得出一个结论如果子组件中没有<slot></slot>标签,则父组件调用子组件时内插入的所有内容都会被丢弃,不会被渲染出来
02 编译作用域
如上面的列子中如果我们想在插槽中使用数据时,会发现插槽中的数据是由父组件的data控制的而不是子组件进行控制,示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>VUE基础教程</title>
<!-- 引用vue.js文件 -->
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<!--由于编译作用域所以这边的v-show与msg其实都是父组件传递的值,因为这些内容都是父组件编译的-->
<Child v-show="isShow">
<p style="color: red">插槽编译作用域示例: {{msg}}</p>
</Child>
</div>
<script>
var Child = {
data: function () {
return {
msg: "我是子组件msg的值"
}
},
// 子组件定义的msg变量值不会渲染到插槽内
template: '<h4>我是子组件<slot></slot></h4>',
}
var vm = new Vue({
el: '#app', // dom的挂载点,这边将dom挂载到id为app的标签上
// 在 components 选项中定义你想要使用的组件
components: {
"Child": Child,
},
data: { // 数据对象
isShow: true,
msg: "我是父组件msg的值"
},
})
</script>
</body>
</html>
编译作用域其实就是一条规则就是,父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
03 插槽默认值(后备内容)
有时为一个插槽设置具体的后备 (也就是默认的) 内容是很有用的,它只会在没有提供内容的时候被渲染。例如在一个 <submit-button> 组件中
<button type="submit">
<slot></slot>
</button>
我们可能希望这个 <button> 内绝大多数情况下都渲染文本“Submit”。为了将“Submit”作为后备内容,我们可以将它放在 <slot> 标签内:
<button type="submit">
<slot>Submit</slot>
</button>
现在当我在一个父级组件中使用 <submit-button> 并且不提供任何插槽内容时:
<submit-button></submit-button>
后备内容“Submit”将会被渲染:
<button type="submit">
Submit
</button>
但是如果我们提供内容:
<submit-button>
Save
</submit-button>
则这个提供的内容将会被渲染从而取代后备内容:
<button type="submit">
Save
</button>
04 具名插槽
具名插槽就是给插槽指定名称我们在使用时通过名称来指定其渲染的位置,具体示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>VUE基础教程</title>
<!-- 引用vue.js文件 -->
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<!--具名插槽示例-->
<Child>
<!--按照插槽名称进行标签传递渲染,具体渲染顺序是根据子组件中编写插槽的顺序来的-->
<template v-slot:header>
<div>我是header</div>
</template>
<template v-slot:footer>
<div>我是footer</div>
</template>
<!--如果不指定插槽名称标签会被渲染至默认插槽处,也就是没有定义名称的插槽位置-->
<template>
<div>我会被渲染至默认插槽位置</div>
</template>
</Child>
</div>
<script>
var Child = {
data: function () {
return {
msg: "我是子组件msg的值"
}
},
// 定义具名插槽,没有定义名称的slot会有一个默认值为default,在父组件调用时没有指定渲染插槽名称的标签会被渲染至默认插槽位置
template: '<div><h4>我是子组件</h4><slot name="header"></slot><slot></slot><slot name="footer"></slot></div>',
}
var vm = new Vue({
el: '#app', // dom的挂载点,这边将dom挂载到id为app的标签上
// 在 components 选项中定义你想要使用的组件
components: {
"Child": Child,
},
data: { // 数据对象
},
})
</script>
</body>
</html>
05 作用域插槽
作用域插槽就是让父组件的插槽内容插能够访问子组件中才有的数据,具体使用示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>VUE基础教程</title>
<!-- 引用vue.js文件 -->
<script src="vue.js"></script>
</head>
<body>
<div id="app">
<!--作用域插槽示例-->
<Child>
<!--这边v-slot后面其实省略了default名称详细写法v-slot:default="slotProps"-->
<template v-slot="slotProps">
<!--通过slotProps获取子组件中给slot v-bind的值,然后进行遍历读取-->
<div v-for="item in slotProps.user">姓名: {{ item.name }} 得分: {{ item.score }}</div>
</template>
</Child>
</div>
<script>
var Child = {
data: function () {
return {
userList: [
{"name": "小明", "score": "90"},
{"name": "小红", "score": "95"},
{"name": "小强", "score": "96"}
]
}
},
// 定义作用域插槽,给slot v-bind了一个userList的值
template: '<div><h4>作用域插槽示例</h4><slot :user="userList"></slot></div>',
}
var vm = new Vue({
el: '#app', // dom的挂载点,这边将dom挂载到id为app的标签上
// 在 components 选项中定义你想要使用的组件
components: {
"Child": Child,
},
data: { // 数据对象
},
})
</script>
</body>
</html>
06 总结
至此我们VUE基础教程就就讲完了,主要讲解了VUE的基础用法,其实VUE还有一些进阶知识如vue-router(前端路由)、vuex(数据状态管理)等内容,但这些内容主要用在项目构建上,成哥在下面AntDesign vue教程中会进行穿插讲解,敬请期待。最后如果喜欢本篇文章不要忘了点赞、关注与转发哦!
-END-
@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。
相关阅读:
猜你喜欢
- 2024-10-29 Vue3 - 表单的输入与绑定(vue实现表单)
- 2024-10-29 67、Vue 中如何实现一个虚拟 DOM?说说你的思路(高薪常 问)
- 2024-10-29 Vue中配合clipboard.js实现点击按钮复制内容到剪切板
- 2024-10-29 「绍棠」 Vue面试整理 一(vue项目面试中怎样去说)
- 2024-10-29 深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别
- 2024-10-29 这大概是理解VUE的虚拟DOM最简单的文章了
- 2024-10-29 vue-这应该是最基础了吧(vue vh)
- 2024-10-29 深入了解Vue 3中onBeforeMount钩子和DOM元素的获取时机
- 2024-10-29 Vue.js教程(六)--Vue实例的属性和方法
- 2024-10-29 Vue中多个元素、组件的过渡及列表过渡的方法示例
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)