二十二、插槽(slot)

组件的插槽

  • 组件的插槽时为了让我们封装的组件更加具有扩展性
  • 让使用者可以决定组件内部的一些内容到底展示什么

■如何去封装这类的组件

  • 它们也很多区别,但是也有很多共性。
  • 如果,我们每一个单独去封装一个组件,显然不合适:比如每个页面都返回,这部分内容我们就要重复去封装。
  • 但是,如果我们封装成一个,好像也不合理:有些左侧是菜单,有些是返回,有些中间是搜索,有些是文字等等。

■如何封装合适,抽取共性,保留不同。

  • 最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽。
  • 一旦我们预留了插槽,就可以让使用者根据自己的需求,决定插槽中插入什么内容。
  • 是搜索框,还是文字,还是菜单。由调用者自己来决定。
1. 插槽的基本使用:<slot></slot>
2. 插槽的默认值:<slot>button<slot>
3. 如果有多个值,同时放入到组件进行替换时,一起作为替换元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!--
  1.插槽的基本使用:<slot></slot>
  2.插槽的默认值:<slot>button<slot>
  3.如果有多个值,同时放入到组件进行替换时,一起作为替换元素
 -->
<div id="app">
  <my_con><button>按钮</button></my_con>
  <my_con><span>哈哈哈</span></my_con>
  <my_con>
    <i>呵呵呵</i>
    <div>我是div元素</div>
    <p>我是p元素</p>
  </my_con>
  <my_con></my_con>
  <my_con></my_con>
</div>
 
<template id="cpnC">
  <div>
    <p>我是组件<i>我是组件,哈哈哈</i></p>
    <!-- 预备插槽 -->
    <slot><button>按钮</button></slot>
  </div>
</template>
 
<script>
  const app = new Vue({
    el: "#app",
    data: {
      message: "Hellow World"
    },
    components:{
      my_con: {
        template: "#cpnC"
      },
    }
  });
</script>

具名插槽  

使用name属性对插槽进行定义,并使用 slot="" ,对指定的插槽进行调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<div id="app">
  <my_cpn>
     
    <div slot="center">
      <span>标题</span>
    </div>
 
    <div slot="left">
      <button>按钮</button>
    </div>
  </my_cpn>
</div>
 
<template id="cpnC">
  <div>
    <slot name="left"><span>左边</span></slot>
    <slot name="center"><span>中间</span></slot>
    <slot name="right"><span>右边</span></slot>
  </div>
</template>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      message: "Hellow World"
    },
    components:{
      my_cpn:{
        template: "#cpnC"
      }
    }
  });
</script>

作用域插槽(父组件替换插槽的标签,但是内容由子组件来提供

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <script src="../Js/vue.min.js"></script>
  </head>
  <body>
    <!-- 父组件替换插槽的标签,但是内容由子组件来提供 -->
    <div id="app">
      <my_cpn></my_cpn>
 
      <my_cpn>
        <!-- <span>JavaScript-</span>
        <span>c++-</span> -->
        <!-- 目的是获取子组件中的pLanguages -->
        <template slot-scope="slot">
          <span>
            {{ slot.data.join(" - ") }}
          </span>
          <!-- <span v-for="item in slot.data">{{item}}- </span> -->
        </template>
      </my_cpn>
 
      <my_cpn>
        <!-- <span>JavaScript-</span>
        <span>c++-</span> -->
        <!-- 目的是获取子组件中的pLanguages -->
        <template slot-scope="obj">
          <span v-for="item in obj.data">{{item}}* </span>
        </template>
      </my_cpn>
    </div>
 
    <template id="cpnC">
      <div>
        <slot :data="pLanguages">
          <ul>
            <li v-for="item in pLanguages"> {{ item }} </li>
          </ul>
        </slot>
      </div>
    </template>
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          message: "Hellow World"
        },
        components: {
          my_cpn: {
            template: "#cpnC",
            data(){
              return {
                pLanguages: ["JavaScript","C++","Java","c#","Python","go","swift"],
              }
            }
          }
        }
      });
    </script>
  </body>
</html>

  

posted @   搬砖工具人  阅读(659)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示