详解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 相关文章推荐
Prototype RegExp对象 学习
Jul 19 Javascript
JQuery jsonp 使用示例代码
Aug 12 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
jQuery插件 Jqplot图表实例
Jun 18 Javascript
用js读写cookie的简单方法(推荐)
Aug 08 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
Apr 04 Javascript
微信小程序页面传多个参数跳转页面的实现方法
May 17 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
Oct 26 Javascript
基于JavaScript实现贪吃蛇游戏
Mar 16 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
Oct 31 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
一个分页的论坛
2006/10/09 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
php-app开发接口加密详解
2018/04/18 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
简单了解Python write writelines区别
2020/02/27 Python
Python API len函数操作过程解析
2020/03/05 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
PHP如何调用MYSQL存储过程
2014/05/30 面试题
迎元旦广播稿
2014/02/22 职场文书
对公司合理化的建议书
2014/03/12 职场文书
英文推荐信格式范文
2014/05/09 职场文书
留学生求职信
2014/06/03 职场文书
结婚幸福感言
2015/08/01 职场文书
《春酒》教学反思
2016/02/22 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书