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 相关文章推荐
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
Jul 21 Javascript
javascript中2个感叹号的用法实例详解
Sep 04 Javascript
jQuery实现图片局部放大镜效果
Mar 17 Javascript
Bootstrap表单布局
Jul 19 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 Javascript
详解jQuery的表单验证插件--Validation
Dec 21 Javascript
node.js实现登录注册页面
Apr 08 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
利用JavaScript的%做隔行换色的实例
Nov 25 Javascript
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
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使用数组填充下拉列表框的方法
2015/03/31 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
python程序文件扩展名知识点详解
2020/02/27 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
全球性的在线购物网站:Zapals
2017/03/22 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
本科生个人求职自荐信
2013/09/26 职场文书
传播学毕业生求职信
2013/10/11 职场文书
5.1手机促销活动
2014/01/17 职场文书
淘宝活动策划方案
2014/02/06 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
私人委托书格式
2014/09/10 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
MySQL主从切换的超详细步骤
2022/06/28 MySQL