Vue中插槽的使用详解

打印 上一主题 下一主题

主题 851|帖子 851|积分 2555

1.介绍

插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。通俗的说是:slot 是在父组建控制了子组件显示或隐藏相关内容。
插槽又分为三种,1.普通插槽    2.具命插槽     3.作用域插槽
1.普通插槽

子组件
  1. <template id="childrenApp">
  2.    
  3.         
  4.         <slot></slot>
  5.         <button>文本1</button>
  6.         <slot></slot>
  7.         <button>文本2</button>
  8.         <slot></slot>
  9.      
  10. </template>
复制代码
父组件
  1. <template>
  2.    
  3.     <children-app>
  4.         <p>组件标签中的内容 {{msg}}</p>
  5.         <h3>标题</h3>
  6.     </children-app>
  7.   
  8. </template>
复制代码
注:如果  的 template 中没有包含一个  元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。
2.具名插槽

在一个组件中有多个插槽,调用的时候为了给不同的组件传递,
参数就需要为插槽进行命名。为不同需求的组件传递不同的参数。
子组件
  1. <template id="childrenApp">
  2.    
  3.         
  4.         <slot name="header"></slot>
  5.         <slot name="footer"></slot>
  6.      
  7. </template>
复制代码
父组件
  1. <template>
  2.    
  3.     <children-app>
  4.         <template v-slot:header><h3>This is header</h3></template>
  5.         <template v-slot:main><h3>This is header</h3></template>
  6.         <template #footer> <h3>This is header</h3></template>
  7.     </children-app>
  8.   
  9. </template>
复制代码
3.作用域插槽

作用域插槽的样式由父组件决定,内容却由子组件控制。前两种插槽不能绑定数据,作用域插槽是一个带绑定数据的插槽。简单的来说就是子组件提供给父组件参数,该参数仅限于插槽中使用,父组件可以根据子组件传过来的插槽数据来进行不同的方式展现和填充插槽的内容。
有时让插槽内容能够访问子组件中才有的数据是很有用的。例如,设想一个带有如下模板的
子组件封装的内容
  1.     <slot>{{ user.lastName }}</slot>
复制代码
而我们在父组件引用,想换掉现有子组件预留的显示内容
  1. <children-app>
  2.     {{ user.firstName }}
  3. </children-app>
复制代码
然而上述代码不会正常工作,因为只有  组件可以访问到 user 而我们提供的内容是在父级渲染的。
解决方式:
为了让 user 在父级的插槽内容中可用,我们可以将 user 作为  元素的一个 attribute 绑定上去:
子组件
  1.                     <slot>{{ user.lastName }}</slot>           
复制代码
绑定在  元素上的 attribute 被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字:
父组件
  1. <template>
  2.    
  3.     <children-app>
  4.         <template v-slot:default="slotProps">
  5.           {{ slotProps.user.firstName }}
  6.         </template>
  7.     </children-app>
  8.   
  9. </template>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表