详解vue2.6插槽更新v-slot用法总结


Posted in Javascript onMarch 09, 2019

在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的特性。新语法的由来可查阅 RFC。

引vue官方文档

之前做项目时,对插槽理解太少了,这两天学习时,才发现插槽更新用v-slot了,自己做了些简单总结,与大家分享一下~

插槽

我的理解就是父页面在组件标签内插入任意内容,子组件内插糟slot控制摆放位置(匿名插槽,具名插槽)

插槽分类

插槽一共就三大类
1.匿名插槽(也叫默认插槽): 没有命名,有且只有一个
2.具名插槽: 相对匿名插槽组件slot标签带name命名的
3.作用域插槽: 子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)

匿名插槽(也叫默认插槽default)

用法:我的理解,匿名插糟只需要一个.(就是这些,不太复杂)

父页面:

<todo-list> 
    <template v-slot:default>
       任意内容
       <p>我是匿名插槽 </p>
    </template>
</todo-list>  
//v-slot:default写上感觉和具名写法比较统一,容易理解,也可以不用写

子组件 todoList.vue

<slot>我是默认值</slot>
##显示##
// 任意内容
// 我是匿名插槽

具名插槽(name)

用法:我的理解,和匿名插槽比较,就是必须起名todo对应,可以有多个具名插槽.(没了~)

父页面

<todo-list> 
    <template v-slot:todo>
       任意内容
       <p>我是匿名插槽 </p>
    </template>
</todo-list> 
// todo
data() {
   return {
    dynamicSlotName:"todo" 
   }

 },

子组件

<slot name="todo">我是默认值</slot>
##显示##
// 任意内容
// 我是匿名插槽

对 v-slot:todo 做操作:

动态命名

v-slot:{dynamicSlotName}//替换标签上 v-slot:todo

具名插槽缩写(匿名插槽用法)(可以后看)

#todo 替换标签上 v-slot:todo

匿名如果想用必须加上default

#default 替换标签上 v-slot:todo

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

作用域插槽

1.重点是slotProps接取子组件里:user="user" :test="test"类似属性的数据

父页面

<todo-list>
 <template v-slot:todo="slotProps" >
   {{slotProps.user.firstName}}
 </template> 
</todo-list> 
//slotProps 可以随意命名
//slotProps 接取的是子组件标签slot上属性数据的集合所有v-bind:user="user"

子组件

<slot name="todo" :user="user" :test="test">
    {{ user.lastName }}
 </slot> 
data() {
    return {
      user:{
        lastName:"Zhang",
        firstName:"yue"
      },
      test:[1,2,3,4]
    }
  },
// {{ user.lastName }}是默认数据  v-slot:todo 当父页面没有(="slotProps")
// 时显示 Zhang


## 显示 ##
// yue

解构插槽Prop

父页面 (子组件不变 显示一样)

// 相当于
function (slotProps) {
 // 插槽内容
}
(slotProps)=>参数可以用slot标签上现有的值({user,test})替换
<todo-list>
 <template v-slot:todo="{user,test}
" >
   {{user.firstName}}
 </template> 
</todo-list> 
## 显示 ##
## // yue

参数值替换名字(可以后看)

<todo-list>
 <template v-slot:todo="{user:person,test}
" >
   {{person.firstName}}
 </template> 
</todo-list> 

// v-slot:[dynamicSlotName]="{user:person,test}
## 显示 ##
## // yue

独占默认插槽缩写(可以后看)
感觉没什么机会用,限制条件太多

总结

在用上v-slot之后 只需要考虑好

1.是否需要命名(匿名插槽,具名插槽)
2.父页面是否需要取存在子页面的数据(作用域插槽)

todo-list实例

可以试一下,便于理解~

父页面

<template>
  <div>
    新插槽 v-slot 代替具名插槽 作用于插槽
    <todo-list
    > 
    <template #todo="{todos:list}">
      <div @click = type(todos.id)>
         {{list.text}}
      </div>
        
    </template>
    </todo-list>  
  </div >
</template>
<script>
import todoList from "@/components/component/slotTodoChildren";
export default {
 name:"vSlot",
 components:{
  todoList
 },
 data() {
   return {

   }
 },
 methods: {
   type(data){
    console.log(data)
   }
 },
}
</script>

子组件

<template>
  <ul class="slotTodoChildren">
    <li class="lis"
      v-for="todo in todoList"
      v-bind:key="todo.id"
    >
      <!--
      我们为每个 todo 准备了一个插槽,
      将 `todo(todoList里的)` 对象作为一个插槽的 prop 传入。
      -->
      <slot name="todo" :todos="todo">
      <!-- 后备内容 -->
      {{ todo.text }}
      </slot>
    </li>
  </ul>
</template>
<script>
export default {
  name:"slotChildren",

  data() {
    return {
      todoList:[
      {
        id:1,      
        text:"扫地"
      },
      {
        id:2,
        text:"做饭"
      },
      {
        id:3,
        text:"擦桌子"
      }
    ]
    }
  },
  created(){
    console.log(this.filteredTodos)
  }
}
</script>
<style scoped>
.slotTodoChildren .lis{
  display: block;
  background: #434534;
  line-height:40px;
  margin-top: 10px;
  color: #fff;
  font-size: 24px;
  height: 40px;
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
非常漂亮的JS代码经典广告
Oct 21 Javascript
修改好的jquery滚动字幕效果实现代码
Jun 22 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
May 15 Javascript
jquery弹出关闭遮罩层实例
Aug 06 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
Dec 30 Javascript
基于canvas实现的绚丽圆圈效果完整实例
Jan 26 Javascript
Javascript 引擎工作机制详解
Nov 30 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
May 02 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
jquery多级树形下拉菜单的实例代码
Jul 09 jQuery
vue实现简单图片上传
Jun 30 Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 #Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 #Javascript
Node.js Event Loop各阶段讲解
Mar 08 #Javascript
vue基础之data存储数据及v-for循环用法示例
Mar 08 #Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 #Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 #Javascript
零基础之Node.js搭建API服务器的详解
Mar 08 #Javascript
You might like
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
js加强的经典分页实例
2013/03/15 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
Python简单进程锁代码实例
2015/04/27 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
对Python信号处理模块signal详解
2019/01/09 Python
浅谈python标准库--functools.partial
2019/03/13 Python
python Pillow图像处理方法汇总
2019/10/16 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
同学聚会祝酒词
2015/08/10 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书