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 CSS菜单功能 改进版
Dec 20 Javascript
javascript 24小时弹出一次的代码(利用cookies)
Sep 03 Javascript
XENON基于JSON变种
Jul 27 Javascript
Javascript延迟执行实现方法(setTimeout)
Dec 30 Javascript
js setTimeout 参数传递使用介绍
Aug 13 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
Dec 08 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 jQuery
实例学习JavaScript读取和写入cookie
Jan 29 Javascript
如何理解Vue的v-model指令的使用方法
Jul 19 Javascript
解决angularjs WdatePicker ng-model的问题
Sep 13 Javascript
你不可不知的Vue.js列表渲染详解
Oct 01 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生成随机用户名和密码的实现代码
2013/02/27 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
php实现留言板功能
2017/03/05 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
代码详解JS操作剪贴板
2018/02/11 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
python之django母板页面的使用
2018/07/03 Python
浅谈Python协程
2020/06/17 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
python 6种方法实现单例模式
2020/12/15 Python
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
AOP的定义以及作用
2013/09/08 面试题
值传递还是引用传递
2015/02/08 面试题
抽样调查项目计划书
2014/04/24 职场文书
管理失职检讨书范文
2015/05/05 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏