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 相关文章推荐
javascript 写类方式之三
Jul 05 Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 Javascript
html5 canvas js(数字时钟)实例代码
Dec 23 Javascript
浅析JS操作DOM的一些常用方法
May 13 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
May 25 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
Aug 25 Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 Javascript
JS实现放烟花效果
Mar 10 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
javascript实现点击产生随机图形
Jan 25 Javascript
详细聊聊vue中组件的props属性
Nov 02 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生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python元组常见操作示例
2019/02/19 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
wxPython实现分隔窗口
2019/11/19 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
python动态规划算法实例详解
2020/11/22 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
光盘行动倡议书
2014/02/02 职场文书
企业内控岗位的职责
2014/02/07 职场文书
家长寄语大全
2014/04/02 职场文书
刑事上诉状范文
2015/05/22 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技