详解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 相关文章推荐
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
巧用局部变量提升javascript性能
Feb 24 Javascript
seajs中模块的解析规则详解和模块使用总结
Mar 12 Javascript
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
JS弹出可拖拽可关闭的div层完整实例
Feb 13 Javascript
js验证身份证号有效性并提示对应信息
Oct 19 Javascript
IONIC自定义subheader的最佳解决方案
Sep 22 Javascript
利用Angular.js编写公共提示模块的方法教程
May 28 Javascript
详解AngularJS跨页面传值(ui-router)
Aug 23 Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 Javascript
Promise静态四兄弟实现示例详解
Jul 07 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
javascript textContent与innerText的异同分析
2010/10/22 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
JS的replace方法介绍
2012/10/20 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
js闭包学习心得总结
2018/04/17 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
vue实现扫码功能
2020/01/17 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
python2.7实现邮件发送功能
2018/12/12 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
十一个高级MySql面试题
2014/10/06 面试题
区优秀教师事迹材料
2014/02/10 职场文书
学生会招新策划书
2014/02/14 职场文书
财务内勤岗位职责
2014/04/17 职场文书
社区矫正工作方案
2014/06/04 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
个人贷款收入证明
2014/10/26 职场文书
表扬信格式模板
2015/05/05 职场文书
2015年女工委工作总结
2015/07/27 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS