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 相关文章推荐
javascript将数组插入到另一个数组中的代码
Jan 10 Javascript
推荐9款炫酷的基于jquery的页面特效
Dec 07 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
javascript每日必学之运算符
Feb 16 Javascript
angular分页指令操作
Jan 09 Javascript
JavaScript实现前端实时搜索功能
Mar 26 Javascript
Vue2.0生命周期的理解
Aug 20 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
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 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
Node.js事件驱动
2015/06/18 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
python 简单的绘图工具turtle使用详解
2017/06/21 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
学习Django知识点分享
2019/09/11 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
jupyter notebook 多行输出实例
2020/04/09 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
主要负责人任命书
2014/06/06 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs