vue插槽slot的理解和使用方法


Posted in Javascript onApril 03, 2019

前言

Vue的slot插槽,可以从字面意思来了解用途,占用占坑的意思,既然是占坑肯定是先占坑后面有其他具体的内容来替换代替。根据slot的应用场景可以分为匿名slot和具名slot。

一、个人理解及插槽的使用场景

刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是“父组件向子组件传递dom时会用到插槽”,这并不能很好的解决我的疑惑。既然你用了子组件,你为什么要给她传一些dom,直接去定义复用的子组件不就好了。后来想想觉得一个复用的组件在不同的地方只有些许变化,如果去重写子组件是很不明智的一件事,当然也可以将不同之处都写在子组件里,然后通过父组件传来的标识进行选择显示。其实质是对子组件的扩展,通过slot插槽向组件内部指定位置传递内容,即将<slot></slot>元素作为承载分发内容的出口;

二、用于理解的例子

目前还没接触到使用插槽解决实际问题很好的例子,只能这样去为了理解插槽而用,可能并没有很好的利用到插槽的好处。

在父组件定义想要传入子组件作为插槽的内容,App.vue

<template>
 <div id="app">
 <div>
 <input type="text" v-model="info">
 <button @click="handleClick">添加</button>
 </div>
 <todolist v-for="item in list" :key="item" :message="msg">
 <template v-slot:item="itemProps" >
 <!-- tips1:<span>即为插槽内容



tips2:item是插槽的名字,为具名插槽,可对应插入到子组件中具体的插槽位置
  tips3:itemProps可以获取到子组件(即插槽 prop)传出来的状态(值),
 
 插槽 prop 的对象命名为 itemProps,可任意命名,itemProps变量存在于 <template> 作用域中
  -->
 <span :style="{fontSize: '20px', color: itemProps.checked ? 'red': 'blue'}">{{item}}</span>
 </template>
 </todolist>
 </div>
</template>

<script>

 import todolist from './components/todolist.vue';
export default {
 name: 'App',
 components: {
 todolist
 },
 data(){
 return {
 msg: '4-2-05',
 info: '',
 list: [],
 }
 },
 methods: {
 handleClick() {
 // 获取到input输入的东西,然后加入到数组中
 this.list.push(this.info);
 this.info = ''
 }
 },
}
</script>

<style>
</style>

在子组件利用<slot></slot>元素作为承载分发内容的出口,父组件的插槽内容将在其中显示,todolist.vue

<template>
 <div>
 {{message}}
 <li class="item">
 <input type="checkbox" v-model="checked">
 <slot name="item" v-bind="{checked}" ></slot>
 <!--插槽内容能够访问子组件中才有的数据是很有用的,又因为父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的
 所以得想办法获取到子组件的数据。-->
 <!--给子组件绑定一个动态参数,checked作为一个 <slot> 元素的特性绑定上去,绑定在 <slot> 元素上的特性被称为插槽 prop-->
 </li>
 </div>
</template>

<script>
 export default {
 props: ['item','message'],
 // 因为父组件在插槽内容里使用item, 即此句代码<span>{{item}}</span>
 // 相当于需要传递给子组件的内容,也就是通常的父子组件通信,所以在子组件需要通过props来获取
 data() {
  return {
  checked: false,
  }
 },
 created() {
  console.log(this.message);
 }
 }
</script>

<style scoped>
 .item {
 color: red;
 }
 li{
 list-style: none;
 }
</style>

三、具体知识点

1、具名插槽

上面的例子只使用了一个slot插槽,但有时我们在一个组件里可能会多处使用插槽,我们希望在不同的插槽处插入不同的内容,此时便需要进行区分,<slot> 元素有一个特殊的特性:name。这个特性可以用来定义插槽的名字,在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用

 v-slot 指令,并以 v-slot 的参数的形式写出插槽的名称,使其一一对应。

<slot name="header"></slot>
 <slot name="content"></slot>
 <slot ></slot>
//一个不带 name 的 <slot> 出口会带有隐含的名字“default”。

2、作用域插槽

为了使父组件的插槽内容可以使用子组件的数据,可以在 <slot> 元素上绑定想要传递的数据,此特性被称为插槽 prop。同时在父级作用域中,给 v-slot 带一个值来定义我们提供的插槽 prop 的名字,便可获取到。但此内容只在 <template>作用域内可用。

四、自 2.6.0 起有所更新的语法变化

1、带有slot特性的具名插槽

2、带有slot-scope特性的作用域插槽

五、突发奇想的调换

因为看到一个别人写的关于slot的帖子,他应该是写错了插槽在子父组件的内容,这也就相当于从子组件传一个插槽内容给父组件。仔细想想这思路有问题,既然都引用了子组件,父组件便可以访问到子组件的所有内容,现在却非要通过插槽来传递,多此一举。

然后我就试了一下将插槽内容卸载子组件里,果然出现了报错,如下:

  - <template v-slot> can only appear at the root level inside the receiving the component(slot的只能出现在接受组件的根级别)

也就是只能在父组件使用。

总结

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

Javascript 相关文章推荐
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
Feb 12 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
javascript类型系统 Array对象学习笔记
Jan 09 Javascript
微信小程序本作用域下调用全局JS详解及实例
Feb 22 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
JS+Ajax实现百度智能搜索框
Aug 04 Javascript
jQuery子选择器与可见性选择器实例分析
Jun 28 jQuery
LayUI动态设置checkbox不显示的解决方法
Sep 02 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
Sep 21 Javascript
layui.tree组件的使用以及搜索节点功能的实现
Sep 26 Javascript
react写一个select组件的实现代码
Apr 03 #Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
Apr 03 #Javascript
JavaScript变速动画函数封装添加任意多个属性
Apr 03 #Javascript
JS中注入eval, Function等系统函数截获动态代码
Apr 03 #Javascript
性能优化篇之Webpack构建速度优化的建议
Apr 03 #Javascript
elementUI多选框反选的实现代码
Apr 03 #Javascript
vue生命周期的探索
Apr 03 #Javascript
You might like
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
php数组去重的函数代码
2013/02/03 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
python dataframe NaN处理方式
2019/12/26 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
给民警的表扬信
2014/01/08 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
《燕子》教学反思
2014/02/18 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
国家助学金感谢信
2015/01/21 职场文书
黄河绝恋观后感
2015/06/08 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
话题作文之诚信
2019/11/28 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL