vue 组件中slot插口的具体用法


Posted in Javascript onApril 03, 2018

子组件

<template>
  <div class="slotcontent">
    <ul>
      <!--<slot></slot>-->
      <li v-for="item in items">{{item.text}}</li>
    </ul>
  </div>
</template>
<script>
  export default{
    data(){
      return{
        items:[
          {id:1,text:'第1段'},
          {id:2,text:'第2段'},
          {id:3,text:'第3段'},
        ]
      }
    }
  }
</script>
<style scoped>
</style>

父组件

<template>
  <div>
    <h2>首页</h2>
    <router-link to="/home/details">跳转到详情</router-link>
    <p>父组件</p>
    <slotshow>
      <p>{{msg}}</p>
    </slotshow>
  </div>
</template>
<script>
  import slotshow from '../components/slotshow'
  export default{
    data(){
      return{
        msg:"测试内容"
      }
    },
    components:{
      slotshow
    }
  }
</script>
<style>
</style>

这种情况是如果要父组件在子组件中插入内容 ,必须要在子组件中声明slot 标签  ,如果子组件模板不包含<slot>插口,父组件的内容<p>{{msg}}</p>将会被丢弃。

 当slot存在默认值<slot><p>默认值</p></slot>,且父元素在<slotshow></slotshow>中没有要插入的内容时,会显示<p>默认值</p>(p标签会去掉),当slot存在默认值,且父元素在<child>中存在要插入的内容时,则显示父组件中设置的值,

具名slot

<slot> 元素可以用一个特殊的属性 name 来配置如何分发内容。多个 slot 可以有不同的名字。具名 slot 将匹配内容片段中有对应 slot 特性的元素

var childNode = {
 template: `
 <div class="child">
 <p>子组件</p>
 <slot name="my-header">头部默认值</slot>
 <slot name="my-body">主体默认值</slot>
 <slot name="my-footer">尾部默认值</slot>
 </div>
 `,
};

var parentNode = {
 template: `
 <div class="parent">
 <p>父组件</p>
 <child>
 <p slot="my-header">我是头部</p>
 <p slot="my-footer">我是尾部</p>
 </child>
 </div>
 `,
 components: {
 'child': childNode
 },
};

vue 组件中slot插口的具体用法

仍然可以有一个匿名 slot,它是默认 slot,作为找不到匹配的内容片段的备用插槽。匿名slot只能作为没有slot属性的元素的插槽,有slot属性的元素如果没有配置slot,则会被抛弃

var childNode = {
 template: `
 <div class="child">
 <p>子组件</p>
 <slot name="my-body">主体默认值</slot>
 <slot></slot>
 </div>
 `,
};

var parentNode = {
 template: `
 <div class="parent">
 <p>父组件</p>
 <child>
 <p slot="my-body">我是主体</p>
 <p>我是其他内容</p>
 <p slot="my-footer">我是尾部</p>
 </child>
 </div>
 `,
 components: {
 'child': childNode
 },
};
<p slot="my-body">插入<slot name="my-body">中,<p>我是其他内容</p>插入<slot>中,而<p slot="my-footer">被丢弃

vue 组件中slot插口的具体用法

如果没有默认的 slot,这些找不到匹配的内容片段也将被抛弃

var childNode = {
 template: `
 <div class="child">
 <p>子组件</p>
 <slot name="my-body">主体默认值</slot>
 </div>
 `,
};

var parentNode = {
 template: `
 <div class="parent">
 <p>父组件</p>
 <child>
 <p slot="my-body">我是主体</p>
 <p>我是其他内容</p>
 <p slot="my-footer">我是尾部</p>
 </child>
 </div>
 `,
 components: {
 'child': childNode
 },
};
<p>我是其他内容</p>和<p slot="my-footer">都被抛弃

vue 组件中slot插口的具体用法

作用域插槽

作用域插槽是一种特殊类型的插槽,用作使用一个 (能够传递数据到) 可重用模板替换已渲染元素。

在子组件中,只需将数据传递到插槽,就像将 props 传递给组件一样

<span style="font-size: 16px"><div class="child">
 <slot text="hello from child"></slot>
</div></span>

在父级中,具有特殊属性 scope 的 <template> 元素必须存在,表示它是作用域插槽的模板。scope 的值对应一个临时变量名,此变量接收从子组件中传递的 props 对象.

var <span style="color: #ffffff">childNode</span> = {
 template: `
 <div class="child">
 <p>子组件</p>
 <slot xxx="hello from child"></slot>
 </div>
 `,
};
var parentNode = {
 template: `
 <div class="parent">
 <p>父组件</p>
 <child>
 <template scope="props">
 <p>hello from parent</p>
 <p>{{ props.xxx }}</p>
 </template>
 </child>
 </div>
 `,
 components: {
 'child': childNode
 },
};

如果渲染以上结果,得到的输出是

vue 组件中slot插口的具体用法

【列表组件】

作用域插槽更具代表性的用例是列表组件,允许组件自定义应该如何渲染列表每一项

var childNode = {
 template: `
 <ul>
 <slot name="item" v-for="item in items" :text="item.text">默认值</slot>
 </ul>
 `,
 data(){
 return{
 items:[
 {id:1,text:'第1段'},
 {id:2,text:'第2段'},
 {id:3,text:'第3段'},
 ]
 }
 }
};

var parentNode = {
 template: `
 <div class="parent">
 <p>父组件</p>
 <child>
 <template slot="item" scope="props">
 <li>{{ props.text }}</li>
 </template>
 </child>
 </div>
 `,
 components: {
 'child': childNode
 },
};

vue 组件中slot插口的具体用法 

总结

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

Javascript 相关文章推荐
CSS常用网站布局实例
Apr 03 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
使用JavaScript动态设置样式实现代码(2)
Jan 25 Javascript
js获取及判断键盘按键的方法
Dec 01 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
Jan 23 Javascript
微信小程序修改swiper默认指示器样式的实例代码
Jul 18 Javascript
Angular事件之不同组件间传递数据的方法
Nov 15 Javascript
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
Aug 13 Javascript
Vue获取微博授权URL代码实例
Nov 04 Javascript
javascript Number 与 Math对象的介绍
Nov 17 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
react 实现页面代码分割、按需加载的方法
Apr 03 #Javascript
深入浅析Vue中的slots/scoped slots
Apr 03 #Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 #Javascript
vue内置指令详解
Apr 03 #Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 #Javascript
Angular2进阶之如何避免Dom误区
Apr 02 #Javascript
Vue项目分环境打包的实现步骤
Apr 02 #Javascript
You might like
php mssql 时间格式问题
2009/01/13 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
Python利用IPython提高开发效率
2016/08/10 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
Python定时器线程池原理详解
2020/02/26 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
书香校园建设方案
2014/05/02 职场文书
学校校庆演讲稿
2014/05/22 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers