详解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拖拽组件
Jul 28 Javascript
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
Jan 08 Javascript
Javascript实现重力弹跳拖拽运动效果示例
Jun 28 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
基于Vue单文件组件详解
Sep 15 Javascript
Vue.js2.0中的变化小结
Oct 24 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
小程序实现授权登陆的解决方案
Dec 02 Javascript
关于js陀螺仪的理解分析
Apr 11 Javascript
vue 内联样式style中的background用法说明
Aug 05 Javascript
代码解析React中setState同步和异步问题
Jun 03 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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
YII路径的用法总结
2014/07/09 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
详解Python的Django框架中的模版相关知识
2015/07/15 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python 多进程原理及实现
2020/12/21 Python
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
委托书样本
2014/04/02 职场文书
买卖协议书范本
2014/04/21 职场文书
建国大业观后感600字
2015/06/01 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python