vue组件化中slot的基本使用方法


Posted in Javascript onMay 01, 2019

前言

slot可以在子组件中开启插槽,在父组件引用该组建时,可以定义这个插槽内要展现的功能或模块,下面话不多说了,来一起看看详细的介绍吧

1.单个slot

子组件中在相应位置写slot标签,父组件在引用子组件时,在子组件标签内写要插入插槽的元素;

还可以设置slot在父组件没有设置插槽时,子组件的插槽默认显示内容;

父组件.vue

<template>
 <div class="home">
 <child-componment>
  <p>
  这是父组件的slot替代内容!
  </p>
 </child-componment>
 </div>
</template>
​
<script>
import childComponment from '@/components/childComponment.vue'
export default {
 name: "home",
 components:{
 childComponment
 },
 data(){
 return {
 message: ''
 }
 }
};
</script>

子组件childComponment.vue

<template>
 <div class="childComponment">
 <h2>这是子组件childComponment!</h2>
 <slot>
  <span style="color: red;">如果父组件没有插入内容,我这样可以设置默认的显示内容</span>
 </slot>
 </div>
</template>
​
<script>
export default {
 name: "childComponment",
 data(){
 return {
  message: ''
 }
 }
};
</script>

2.具名slot(同时使用多个插槽)

给slot指定一个名称,可以分发多个slot插槽,但是只能有一个无名slot;

父组件的slot插槽内容,不写slot="xxx"的都会插到子组件的无名slot中;

如果没有指定无名slot(默认slot),父组件内多余的内容将会被抛弃。

<template>
 <div class="home">
 <child-componment>
  <h1 slot="header">
  父组件的header
  </h1>
  <h6 slot="footer">父组件的footer</h6>
  
  <h6>父组件的无名slot-1</h6>
  <p>
  父组件的无名slot-2
  </p>
 </child-componment>
 </div>
</template>
​
<script>
import childComponment from '@/components/childComponment.vue'
export default {
 name: "home",
 components:{
 childComponment
 },
 data(){
 return {
  message: ''
 }
 }
};
</script>

子组件

<template>
 <div class="childComponment">
 <span>这是子组件childComponment的正常内容!</span>
 <div class="header">
  <slot name="header">
  <span style="color: red;">子组件默认header-slot</span>
  </slot>
 </div>
 <div class="container">
  <!-- 如果没有指定无名slot(默认slot),父组件内多余的内容将会被抛弃 -->
  <slot>
  <span style="color: red;">子组件默认无名slot</span>
  </slot>
 </div>
 <div class="footer">
  <slot name="footer">
  <span style="color: red;">子组件默认footer-slot</span>
  </slot>
 </div>
 </div>
</template>
​
<script>
export default {
 name: "childComponment",
 data(){
 return {
  message: ''
 }
 }
};
</script>
<style scoped>
.childComponment{
 font-size: 16px;
}
.header{
 height: 100px;
 border:1px solid red;
 color: red;
}
.container{
 height: 500px;
 border: 1px solid black;
 color: black;
}
.footer{
 height:100px;
 border: 1px grey solid;
 color: grey;
}
</style>

vue组件化中slot的基本使用方法

3.作用域插槽

<template>
 <div class="home">
 <child-componment>
  <template slot-scope="slotProps">
  <!-- 这里显示子组件传来的数据 -->
  <p>{{slotProps}}</p>
  </template>
 </child-componment>
 </div>
</template>
​
<script>
import childComponment from '@/components/childComponment.vue'
export default {
 name: "home",
 components:{
 childComponment
 }
};
</script>

子组件

<template>
 <div class="childComponment">
 <span>这是子组件childComponment的正常内容!</span>
 <div class="container">
  <!-- 如果没有指定无名slot(默认slot),父组件内多余的内容将会被抛弃 -->
  <slot msg="子组件信息" slotData="子组件数据"></slot>
 </div>
 </div>
</template>

Tips:

作用于插槽也可是具名插槽

案例:列表组件

这是作用于插槽使用最多的案例,允许组件自定义应该如何渲染组件的每一项。

<template>
 <div class="about">
 <h1>This is about page</h1>
 <my-list :books="books">
 <template slot="bookList" slot-scope="myListProps">
  <li>{{myListProps.bookName}}</li>
 </template>
 </my-list>
 </div>
</template>
<script>
import myList from '@/components/myList.vue'
export default {
 components:{
 myList
 },
 data(){
 return {
  books: [
  {name: 'css揭秘'},
  {name: '深入浅出nodejs'},
  {name: 'javascript设计模式与开发实战'}
  ]
 }
 }
}
</script>

子组件myList.vue

<template>
 <div class="myList">
 <h1>This is myList page</h1>
 <ul>
 <slot name="bookList" v-for="book in books" :bookName="book.name"></slot>
 </ul>
 </div>
</template>
<script>
export default {
 props:{
 books:{
  type: Array,
  default: function(){
  return []
  }
 }
 },
 mounted(){
 console.log(this.books)
 }
}
</script>

其实上面的案例可直接在父组件中for循环就好,此处只是作为演示slot的作用域插槽;

实际开发中作用域插槽的使用场景主要为:既可以复用子组件的slot,又可以使slot内容不一致。

4.访问slot

vue2.0提供了$slot方法来访问slot

此处代码以**“具名slot(同时使用多个插槽)”**的代码为例,修改一下子组件childComponment.vue

export default {
 name: "childComponment",
 data(){
 return {
  message: ''
 }
 },
 mounted(){
 let header = this.$slots.header
 let main = this.$slots.default
 let footer = this.$slots.footer
 console.log(header)
 console.log(main)
 console.log(footer)
 console.log(footer[0].elm.innerHTML)
 }
};

打印结果:

vue组件化中slot的基本使用方法

其中elm的内容为插槽内容,结构如下:

vue组件化中slot的基本使用方法

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Jquery 滑入滑出效果实现代码
Mar 27 Javascript
使用jQuery.fn自定义jQuery翻页插件
Jan 20 Javascript
框架页面高度自动刷新的Javascript脚本
Nov 01 Javascript
js限制input标签中只能输入中文
Jun 26 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 Javascript
Koa2微信公众号开发之消息管理
May 16 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
微信小程序新手教程之启动页的重要性
Mar 03 Javascript
javascript中call,apply,callee,caller用法实例分析
Jul 24 Javascript
jquery实现吸顶导航效果
Jan 08 jQuery
vue实现一个6个输入框的验证码输入组件功能的实例代码
Jun 29 Javascript
Node.js fs模块原理及常见用途
Oct 22 Javascript
Vue基本使用之对象提供的属性功能
Apr 30 #Javascript
原生JS实现随机点名项目的实例代码
Apr 30 #Javascript
vue实现随机验证码功能的实例代码
Apr 30 #Javascript
详解vue 图片上传功能
Apr 30 #Javascript
vue移动端屏幕适配详解
Apr 30 #Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
Apr 30 #Javascript
微信小程序时间戳转日期的详解
Apr 30 #Javascript
You might like
精通php的十大要点(上)
2009/02/04 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
php生成圆角图片的方法
2015/04/07 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
jquery div 居中技巧应用介绍
2012/11/24 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
bootstrap datepicker的基本使用教程
2019/07/09 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
vue实现放大镜效果
2020/09/17 Javascript
python实现计算资源图标crc值的方法
2014/10/05 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python更换pip源方法过程解析
2020/05/19 Python
详解python对象之间的交互
2020/09/29 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
统计员岗位职责
2013/11/14 职场文书
大学生职业生涯规划范文
2013/12/31 职场文书
大学生应聘求职信
2014/05/26 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
营业用房租赁协议书
2014/11/26 职场文书
云台山导游词
2015/02/03 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
关于观后感的作文
2015/06/18 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书