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


    插槽(slot)

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

    插槽的基本使用

    <!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>

    运行效果

    定义默认值

    <!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>

    运行效果

    替换为多个标签

    <!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>

    运行效果

    多个普通插槽替换

    <!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将所有的插槽都替换为了同样的,但是这并不是我想要的,这个时候就会用到具名插槽了

    具名插槽

    <!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>

    运行效果

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

    作用域插槽

    <!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传递到了父组件进行重新渲染

    作者:彼岸舞

    时间:202162

    内容关于:VUE

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

  • 相关阅读:
    php实现拼图滑块验证的思考及部分实现
    【php设计模式】门面模式
    【php设计模式】装饰器模式
    php 如何将image图片转化为字符串(GD库操作及imagick两种实现方式)
    【php设计模式】组合模式
    【php设计模式】桥接模式
    深拷贝和浅拷贝
    【php设计模式】适配器模式
    【php设计模式】建造者模式
    Java50道经典习题-程序29 求矩阵对角线之和
  • 原文地址:https://www.cnblogs.com/flower-dance/p/14842018.html
Copyright © 2020-2023  润新知