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 相关文章推荐
基于jQuery的遍历同id元素 并响应事件的代码
Jun 14 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 Javascript
jQuery简单实现网页选项卡特效
Nov 24 Javascript
jQuery实现垂直半透明手风琴特效代码分享
Aug 21 Javascript
Vue.js每天必学之Class与样式绑定
Sep 05 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
vue2.0安装style/css loader的方法
Mar 14 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
javascript实现异形滚动轮播
Nov 28 Javascript
js动态生成表格(节点操作)
Jan 12 Javascript
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结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
深入理解python中的闭包和装饰器
2016/06/12 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
Python中Unittest框架的具体使用
2019/08/27 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
保安拾金不昧表扬信
2014/01/15 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
小学领导班子对照材料
2014/08/23 职场文书
法人委托书的范本格式
2014/09/11 职场文书
工作表扬信
2015/01/17 职场文书
中标通知书范本
2015/04/17 职场文书
党员个人承诺书
2015/04/27 职场文书
超市员工辞职信范文
2015/05/12 职场文书
晚会开场白和结束语
2015/05/29 职场文书
篮球拉拉队口号
2015/12/25 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python