vue--使用插槽和具名插槽解决组件内容传递问题

公共部分:

<div id="root"></div>
<script src="https://unpkg.com/vue@next"></script>


1.插槽:

<script>
        // slot 插槽  里面可以传的有 DOM文档、字符串、数字、子组件等
        // slot 无法直接绑定事件
        const app = Vue.createApp({
            template: `
             <myForm>
               <test />   
            </myForm>
             <myForm>
                <button>提交</button>
             </myForm>
            `
        });

        //v-model后面的修饰符,例如:.uppercase,通过 props 传递给子组件
        //子组件通过 modelModifiers 来进行接收,

        // 创建全局组件
        app.component('myForm', {
            methods: {
                handleClick() {
                    alert(123);
                },
            },
            template: `
            <div>
                <input />
                <span @click="handleClick">
                    <slot></slot>
                </span>
            </div>
            `,
        });

        app.component('test', {
            template: '<div>test</div>'
        })

        //将组件挂到root节点里,即只作用在id等于root的div元素里
        //vm 代表的就是 vue 应用的根组件
        const vm = app.mount('#root');

        //vm.$data 获得数据
        // vm.$data.message = 'root';
</script>

或,

<script>
        // slot 插槽  里面可以传的有 DOM文档、字符串、数字、子组件等
        // slot 无法直接绑定事件
        //父模板里调用的数据属性,使用的都是父模板里的数据
        //子模板里调用的数据属性,使用的都是子模板里的数据
        const app = Vue.createApp({
            data() {
                return {
                    text: '提交'
                }
            },
            template: `
             <myForm>
                <div>{{text}}</div>  
            </myForm>
             <myForm>
                <button>{{text}}</button>
             </myForm>
            <myForm></myForm>
            `
        });

        //v-model后面的修饰符,例如:.uppercase,通过 props 传递给子组件
        //子组件通过 modelModifiers 来进行接收,

        // 创建全局组件
        app.component('myForm', {
            methods: {
                handleClick() {
                    alert(123);
                },
            },
            template: `
            <div>
                <input />
                <span @click="handleClick">
                    <slot>default value</slot>
                </span>
            </div>
            `,
        });

        app.component('test', {
            template: '<div>test</div>'
        })

        //将组件挂到root节点里,即只作用在id等于root的div元素里
        //vm 代表的就是 vue 应用的根组件
        const vm = app.mount('#root');

        //vm.$data 获得数据
        // vm.$data.message = 'root';
</script>


2.具名插槽:

有时我们需要多个插槽

对于这样的情况,<slot> 元素有一个特殊的 attribute:name。这个 attribute 可以用来定义额外的插槽

在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称

现在 <template> 元素中的所有内容都将会被传入相应的插槽

任何没有被包裹在带有 v-slot<template> 中的内容都会被视为默认插槽的内容

如果你希望更明确一些,仍然可以在一个 <template> 中包裹默认插槽的内容

注意 v-slot 只能添加在 <template> (只有一种例外情况),这一点和已经废弃的 slot attribute 不同

<script>
        // 具名插槽 
        const app = Vue.createApp({
            data() {
                return {
                    text: '提交'
                }
            },
            // v-slot: === #
            template: `
             <layout>
                <template v-slot:header>
                    <div>header</div> 
                </template>
                <template v-slot:footer> 
                    <div>footer</div> 
                </template> 
            </layout>
            `
        
            //或者
            // template: `
            //  <layout>
            //     <template #header>
            //         <div>header</div>
            //     </template>
            //     <template #footer>
            //         <div>footer</div>
            //     </template>
            // </layout>
            // `
        });

        //v-model后面的修饰符,例如:.uppercase,通过 props 传递给子组件
        //子组件通过 modelModifiers 来进行接收,

        // 创建全局组件
        app.component('layout', {
            template: `
            <div>
               <slot name="header"></slot>
               <div>content</div>
               <slot name="footer"></slot>
            </div>
            `,
        });

        //将组件挂到root节点里,即只作用在id等于root的div元素里
        //vm 代表的就是 vue 应用的根组件
        const vm = app.mount('#root');

        //vm.$data 获得数据
        // vm.$data.message = 'root';
</script>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白小白从不日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值