vue组件详解之使用slot分发内容


Posted in Javascript onApril 09, 2018

一、什么是slot

在使用组件时,我们常常要像这样组合它们:

<app>
 <app-header></app-header>
 <app-footer></app-footer>
</app>

当需要让组件组合使用,混合父组件的内容与子组件的模板时,就会用到slot , 这个过程叫作内容分发( transclusion )。

注意两点:

1.< app>组件不知道它的挂载点会有什么内容。挂载点的内容是由<app >的父组件决定的。

2.<app> 组件很可能有它自己的模板。

props 传递数据、events 触发事件和slot 内容分发就构成了Vue 组件的3 个API 来源,再复杂的组件也是由这3 部分构成的。

 二、作用域

<child-component>
 {{ message }}
</child-component>

这里的message 就是一个slot ,但是它绑定的是父组件的数据,而不是组件<child-component>的数据。

父组件模板的内容是在父组件作用域内编译,子组件模板的内容是在子组件作用域内编译。如:

<div id="app15">
      <child-component v-show="showChild"></child-component>
    </div>
Vue.component('child-component',{
  template: '<div>子组件</div>'
});
var app15 = new Vue({
  el: '#app15',
  data: {
    showChild: true
  }
});

这里的状态showChild 绑定的是父组件的数据,如果想在子组件上绑定,那应该是:

<div id="app15">
      <child-component></child-component>
    </div>
Vue.component('child-component',{
  template: '<div v-show="showChild">子组件</div>',
  data: function(){
    return {
      showChild: true
    }
  }
});

因此, slot 分发的内容,作用域是在父组件上的。

三、slot用法

3.1 单个slot

在子组件内使用特殊的<slot>元素就可以为这个子组件开启一个slot(插槽),在父组件模板里,插入在子组件标签内的所有内容将替代子组件的<slot> 标签及它的内容。   

<div id="app16">
      <my-component16>
        <p>分发的内容</p>
        <p>更多分发的内容</p>
      </my-component16>
    </div>
Vue.component('my-component16',{
  template: '<div>' +
        '<slot><p>如果父组件没有插入内容,我将作为默认出现<</p></slot>' +
//预留的slot插槽
       '</div>'
});
var app16 = new Vue({
  el: '#app16'
});

渲染结果为:

<div id=”app16”>
  <div>
    <p>分发的内容<p>
    <p>更多分发的内容<p>
  </div>
</div>

 子组件child-component 的模板内定义了一个<slot>元素,并且用一个<p>作为默认的内容,在父组件没有使用slot 时,会渲染这段默认的文本;如果写入了slot, 那就会替换整个<slot> 。

3.2具名slot

给<slot> 元素指定一个name 后可以分发多个内容,具名Slot 可以与单个slot 共存。

<div id="app17">
      <my-component17>
        <h3 slot="header">标题</h3>
        <p>正文内容</p>
        <p>更多正文内容</p>
        <h3 slot="footer">底部信息</h3>
      </my-component17>
    </div>
Vue.component('my-component17',{
  template: '<div class="container">' +
         '<div class="header">' +
          '<slot name="header"></slot>' +
         '</div>' +
         '<div class="main">' +
          '<slot></slot>' +
         '</div>'+
         '<div class="footer">' +
          '<slot name="footer"></slot>' +
         '</div>'+
       '</div>'
});
var app17 = new Vue({
  el: '#app17'
});

渲染结果为:         

<div id="app17">
        <div class="container">
          <div class="header">
            <h3>标题</h3></div>
          <div class="main"> 
            <p>正文内容</p> 
            <p>更多正文内容</p> 
          </div>
          <div class="footer">
            <h3>底部信息</h3>
          </div>
        </div>
      </div>

 子组件内声明了3 个<s lot>元素,其中在<div class=” main >内的<slot> 没有使用name 特性,它将作为默认slot 出现,父组件没有使用slot 特性的元素与内容都将出现在这里。

如果没有指定默认的匿名slot ,父组件内多余的内容片段都将被抛弃。

四、作用域插槽

作用域插槽是一种特殊的slot ,使用一个可以复用的模板替换己渲染元素。

看一个例子:     

<div id="app18">
      <my-component18>
        <template scope="props">
          <p>来自父组件的内容</p>
          <p>{{props.msg}}</p>
        </template>
      </my-component18>
    </div>
Vue.component('my-component18',{
  template: '<div class="container"><slot msg="来自子组件的内容"></slot></div>'
});
var app18 = new Vue({
  el: '#app18'
});

观察子组件的模板,在<slot>元素上有一个类似props 传递数据给组件的写法msg=” xxx ”,将数据传到了插槽。

父组件中使用了<template>元素,而且拥有一个scope=”props ”的特性,这里的props只是一个临时变量,就像v-for= ” item in items 里面的item 一样,template 内可以通过临时变量props访问来自子组件插槽的数据msg 。

下面看下Vue组件中slot的用法

主要是让组件的可扩展性更强。

1. 使用匿名slot

vue组件详解之使用slot分发内容

2. 给slot加个名字

vue组件详解之使用slot分发内容

如果不在有slot的组件里加入任何标签,slot什么都不会显示的。

总结

以上所述是小编给大家介绍的vue组件详解之使用slot分发内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Jquery数独游戏解析(一)-页面布局
Nov 05 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
Feb 01 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
javascript实现单击和双击并存的方法
Dec 13 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
Feb 28 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
jQuery查看选中对象HTML代码的方法
Jun 17 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
Jun 07 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 jQuery
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
vue组件中使用props传递数据的实例详解
Apr 08 #Javascript
Vue入门之animate过渡动画效果
Apr 08 #Javascript
vue组件与复用详解
Apr 08 #Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 #Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 #Javascript
vue-infinite-loading2.0 中文文档详解
Apr 08 #Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
Apr 08 #Javascript
You might like
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
Javascript 强制类型转换函数
2009/05/17 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
Python+MongoDB自增键值的简单实现
2016/11/04 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
Python单元测试实例详解
2018/05/25 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
工程专业求职自荐书范文
2014/02/18 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
经理岗位职责范本
2015/04/15 职场文书
三八妇女节新闻稿
2015/07/17 职场文书
创业计划书之面包店
2019/09/17 职场文书
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL