前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始学VUE之组件化开发(插槽 slot)

从零开始学VUE之组件化开发(插槽 slot)

作者头像
彼岸舞
发布2021-06-07 17:37:26
6270
发布2021-06-07 17:37:26
举报
文章被收录于专栏:java开发的那点事

插槽(slot)

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

插槽的基本使用

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
    <div id="app">
<!--      替换插槽内容-->
      <cpn>
        <button>按钮</button>
      </cpn>
      <cpn>
        <span>按钮</span>
      </cpn>
    </div>
</body>
<template id="cpn">
  <div>
    <h2>我是组件</h2>
<!--    定义插槽-->
    <slot></slot>
  </div>
</template>
<script>
    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {

        },
        components:{
          cpn:{
            template:'#cpn'
          }
        }
    })
</script>
</html>

运行效果

定义默认值

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
    <div id="app">
<!--        不替换展示默认值-->
      <cpn></cpn>
<!--      替换插槽内容-->
      <cpn>
        <span>按钮</span>
      </cpn>
    </div>
</body>
<template id="cpn">
  <div>
    <h2>我是组件</h2>
<!--    定义插槽:携带默认值-->
    <slot>
        <button>按钮</button>
    </slot>
  </div>
</template>
<script>
    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {

        },
        components:{
          cpn:{
            template:'#cpn'
          }
        }
    })
</script>
</html>

运行效果

替换为多个标签

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--        不替换展示默认值-->
    <cpn></cpn>
    <!--      替换插槽内容-->
    <cpn>
        <span>手机号:</span>
        <input type="text">
    </cpn>
</div>
</body>
<template id="cpn">
    <div>
        <h2>我是组件</h2>
        <!--    定义插槽:携带默认值-->
        <slot>
            <button>按钮</button>
        </slot>
    </div>
</template>
<script>
    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {},
        components: {
            cpn: {
                template: '#cpn'
            }
        }
    })
</script>
</html>

运行效果

多个普通插槽替换

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--      替换插槽内容-->
    <cpn>
        <span>手机号:</span>
        <input type="text">
    </cpn>
</div>
</body>
<template id="cpn">
    <div>
        <slot></slot>
        <h2>我是组件</h2>
        <slot></slot>
    </div>
</template>
<script>
    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {},
        components: {
            cpn: {
                template: '#cpn'
            }
        }
    })
</script>
</html>

运行效果

可以看到Vue将所有的插槽都替换为了同样的,但是这并不是我想要的,这个时候就会用到具名插槽了

具名插槽

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--      替换插槽内容-->
    <cpn>
        <!--        使用时通过名名称替换 如果不指定名称 就会替换掉没有指定名称的插槽-->
        <div slot="top">
            <h1>具名插槽</h1>
        </div>
        <div slot="bottom">
            <span>手机号:</span>
            <input type="text">
        </div>
    </cpn>
</div>
</body>
<template id="cpn">
    <div>
        <!--        给插槽定义名称 -->
        <slot name="top"></slot>
        <h2>我是组件</h2>
        <slot name="bottom"></slot>
    </div>
</template>
<script>
    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {},
        components: {
            cpn: {
                template: '#cpn'
            }
        }
    })
</script>
</html>

运行效果

这次可以看到,根据自己想要的替换了指定的插槽

作用域插槽

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
    <cpn>
<!--        通过定义template标签 指定slot的作用域 获取到数据-->
        <template slot-scope="slot">
<!--            进行数据格式化-->
            <span>{{slot.data.join('-')}}</span>
            <span>{{slot.message}}</span>
        </template>
    </cpn>
</div>
</body>
<template id="cpn">
    <div>
        <h2>我是组件</h2>
<!--        通过:data动态绑定数据传输到外面 这个data不是固定的如果需要传递其他数据也可以叫 :planguage-->
        <slot :data="planguage" :message="message">
            <ul>
                <li v-for="item in planguage">{{item}}</li>
            </ul>
        </slot>
    </div>
</template>
<script>
    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {},
        components: {
            cpn: {
                template: '#cpn',
                data(){
                    return {
                        planguage: ['spring','springmvc','springboot'],
                        message:'我是message'
                    }
                }
            }
        }
    })
</script>
</html>

运行效果

可以看到,子组件中的数据通过slot传递到了父组件进行重新渲染

作者:彼岸舞

时间:2021\06\02

内容关于:VUE

本文属于作者原创,未经允许,禁止转发

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 插槽(slot)
    • 插槽的基本使用
      • 定义默认值
        • 替换为多个标签
          • 多个普通插槽替换
            • 具名插槽
              • 作用域插槽
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档