1.组件插槽的作用
2.组件插槽基本用法
2.1 插槽位置
| Vue.component('alert-box', { |
| template: ` |
| <div class="demo-alert-box"> |
| <strong>Error!</strong> |
| <slot></slot> |
| </div> |
| ` |
| }) |
2.2 插槽内容
<alert-box>Something bad happened.</alert-box>
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Document</title> |
| </head> |
| <body> |
| <div id="app"> |
| <alert-box>有bug发生</alert-box> |
| <alert-box>有一个警告</alert-box> |
| <alert-box></alert-box> |
| </div> |
| <script type="text/javascript" src="js/vue.js"></script> |
| <script type="text/javascript"> |
| |
| |
| |
| Vue.component('alert-box', { |
| template: ` |
| <div> |
| <strong>ERROR:</strong> |
| <slot>默认内容</slot> |
| </div> |
| ` |
| }); |
| var vm = new Vue({ |
| el: '#app', |
| data: { |
| |
| } |
| }); |
| </script> |
| </body> |
| </html> |
3 具名插槽用法
3.1 插槽定义
| <div class="container"> |
| <header> |
| <slot name="header"></slot> |
| </header> |
| <main> |
| <slot></slot> |
| </main> |
| <footer> |
| <slot name="footer"></slot> |
| </footer> |
| </div> |
3.2 插槽内容
| <base-layout> |
| <h1 slot="header">标题内容</h1> |
| <p>主要内容1</p> |
| <p>主要内容2</p> |
| <p slot="footer">底部内容</p> |
| </base-layout> |
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Document</title> |
| </head> |
| <body> |
| <div id="app"> |
| <base-layout> |
| <p slot='header'>标题信息</p> |
| <p>主要内容1</p> |
| <p>主要内容2</p> |
| <p slot='footer'>底部信息信息</p> |
| </base-layout> |
| |
| <base-layout> |
| <template slot='header'> |
| <p>标题信息1</p> |
| <p>标题信息2</p> |
| </template> |
| <p>主要内容1</p> |
| <p>主要内容2</p> |
| <template slot='footer'> |
| <p>底部信息信息1</p> |
| <p>底部信息信息2</p> |
| </template> |
| </base-layout> |
| </div> |
| <script type="text/javascript" src="js/vue.js"></script> |
| <script type="text/javascript"> |
| /* |
| 具名插槽 |
| */ |
| Vue.component('base-layout', { |
| template: ` |
| <div> |
| <header> |
| <slot name='header'></slot> |
| </header> |
| <main> |
| <slot></slot> |
| </main> |
| <footer> |
| <slot name='footer'></slot> |
| </footer> |
| </div> |
| ` |
| }); |
| var vm = new Vue({ |
| el: '#app', |
| data: { |
| |
| } |
| }); |
| </script> |
| </body> |
| </html> |
4 作用域插槽
4.1 插槽定义
| <ul> |
| <li v-for= "item in list" v-bind:key= "item.id" > |
| <slot v-bind:item="item"> |
| {{item.name}} |
| </slot> |
| </li> |
| </ul> |
4.2 插槽内容
| <fruit-list v-bind:list= "list"> |
| <template slot-scope="slotProps"> |
| <strong v-if="slotProps.item.current"> |
| {{ slotProps.item.text }} |
| </strong> |
| </template> |
| </fruit-list> |
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Document</title> |
| </head> |
| <style type="text/css"> |
| .current { |
| color: orange; |
| } |
| </style> |
| <body> |
| <div id="app"> |
| <fruit-list :list='list'> |
| <template slot-scope='slotProps'> |
| <strong v-if='slotProps.info.id==3' class="current">{{slotProps.info.name}}</strong> |
| <span v-else>{{slotProps.info.name}}</span> |
| </template> |
| </fruit-list> |
| </div> |
| <script type="text/javascript" src="js/vue.js"></script> |
| <script type="text/javascript"> |
| |
| |
| |
| Vue.component('fruit-list', { |
| props: ['list'], |
| template: ` |
| <div> |
| <li :key='item.id' v-for='item in list'> |
| <slot :info='item'>{{item.name}}</slot> |
| </li> |
| </div> |
| ` |
| }); |
| var vm = new Vue({ |
| el: '#app', |
| data: { |
| list: [{ |
| id: 1, |
| name: 'apple' |
| },{ |
| id: 2, |
| name: 'orange' |
| },{ |
| id: 3, |
| name: 'banana' |
| }] |
| } |
| }); |
| </script> |
| </body> |
| </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)