Vuejs学习笔记(二)-12.组件插槽基本使用

场景:在实际项目中,很多页面有相似的模块(组件)架构,比如APP导航栏。

导航组件1:Vuejs学习笔记(二)-12.组件插槽基本使用

 

 

导航组件2:Vuejs学习笔记(二)-12.组件插槽基本使用

 

导航组件3:Vuejs学习笔记(二)-12.组件插槽基本使用

 

以上三个页面共性部分就是左中右三个标签,左侧标签相同都是跳转连接,中间2个是title,1个是tab切换bar,右侧2个是跳转页面连接,1个为空。

对于这样的场景开发3个不同的导航栏代码量大了,所以只需要一个导航栏组件。

要点:1.对于相同结构的模块使用一个组件来构造其结构。

           2.对于同一个部分展示不同的功能可以使用插槽,插槽有能力发挥扩展作用。

插槽有什么用?如何扩展模块功能?-----思考--->接线板有什么用?电脑接口有什么用?

答案:扩展功能用。即电脑接口可以外接显示器,可以外接硬盘,外接音箱。

我们来看一个案例:

以下是一个父组件在使用了子组件多次

 1 <!--
 2 @author:invoker
 3 @project:project_lianxi
 4 @file: 01-slot的基本使用.html
 5 @contact:invoker2021@126.com
 6 @descript:
 7 @Date:2021/7/5 9:10
 8 @version: html5
 9 -->
10 
11 <!DOCTYPE html>
12 <html lang="en">
13 <head>
14   <meta charset="UTF-8">
15   <title>01-slot的基本使用</title>
16 </head>
17 <body>
18 <div id="app">
19   <h2>{{ message }}</h2>
20   <p>------------------------父子组件分割线----------------------------</p>
21   <cpn></cpn>
22   <p>------------------------子组件分割线----------------------------</p>
23   <cpn></cpn>
24   <p>------------------------子组件分割线----------------------------</p>
25   <cpn></cpn>
26 </div>
27 
28 <template id="cpn">
29   <div>
30     <h2>我是子组件1</h2>
31   </div>
32 </template>
33 <script src="../js/vue.js"></script>
34 <script>
35   const cpn = {
36     template: '#cpn'
37   }
38 
39   const app = new Vue({
40     el: '#app',
41     data: {
42       message: 'hello 插槽'
43     },
44     components: {
45       cpn
46     }
47   })
48 </script>
49 </body>
50 </html>

Vuejs学习笔记(二)-12.组件插槽基本使用

 

 

 我们希望子组件内显示不同的页面元素,比如第一个子组件显示按钮,第二个子组件显示输入框,第三个字组件显示超链接。

实现步骤如下:

1.需要使用在子组件内部定义插槽<slot>

Vuejs学习笔记(二)-12.组件插槽基本使用

 

 

2.在父组件调用子组件标签的内部插入不同元素

Vuejs学习笔记(二)-12.组件插槽基本使用

 

 页面如下:

Vuejs学习笔记(二)-12.组件插槽基本使用

 

 

代码如下:

 1 <!--
 2 @author:invoker
 3 @project:project_lianxi
 4 @file: 01-slot的基本使用.html
 5 @contact:invoker2021@126.com
 6 @descript:
 7 @Date:2021/7/5 9:10
 8 @version: html5
 9 -->
10 
11 <!DOCTYPE html>
12 <html lang="en">
13 <head>
14   <meta charset="UTF-8">
15   <title>01-slot的基本使用</title>
16 </head>
17 <body>
18 <div id="app">
19   <h2>{{ message }}</h2>
20   <p>------------------------父子组件分割线----------------------------</p>
21   <cpn><button>插入按钮</button></cpn>
22   <p>------------------------子组件分割线----------------------------</p>
23   <cpn><input type="text" placeholder="插入输入框"></cpn>
24   <p>------------------------子组件分割线----------------------------</p>
25   <cpn><a href="www.google.com">插入谷歌链接</a></cpn>
26 </div>
27 
28 <template id="cpn">
29   <div>
30     <h2>我是子组件1</h2>
31     <slot></slot>
32   </div>
33 </template>
34 <script src="../js/vue.js"></script>
35 <script>
36   const cpn = {
37     template: '#cpn'
38   }
39 
40   const app = new Vue({
41     el: '#app',
42     data: {
43       message: 'hello 插槽'
44     },
45     components: {
46       cpn
47     }
48   })
49 </script>
50 </body>
51 </html>

 

上一篇:从零开始学VUE之组件化开发(语法糖优化组件注册)


下一篇:被唤醒后的线程到底重新执行同步代码块还是从那是等待的那里继续执行