Vue入门-插槽

slot插槽

Vue 实现了一套内容分发的 API,将 <slot> 元素作为承载分发内容的出口。使用slot插槽,可以更好的实现组件复用。

具名插槽

可以将内容进行细分,指定内容放置的插槽位置。

作用域插槽

可以让内容使用插槽中绑定的数据,而不是父级中的变量。

示例代码(参照上面的解释及代码注释理解代码)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>插槽</title>
    <style>
        #app {
            width: 500px;
            margin: auto;
            border: 1px solid blue;
            border-radius: 10px;
        }

        #wrapper1,
        #wrapper2,
        #wrapper3 {
            width: 400px;
            margin: 20px auto;
            border: 1px solid red;
            border-radius: 8px;
            padding-left: 10px;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>

<body>
    <div id="app">
        <child1>
            <!--注意:要使用父级作用域中的变量,比如msg-->
            <h2>今日头条</h2>
            <p>详情{{msg}}</p>
            <p>新闻评论</p>
        </child1>
        <child2>
            <h1 slot="header">这是一个h1标题</h1>
            <h2 slot="main">这是一个h2标题</h2>
            <!--没有指定名字的,会插到没有名字的插槽中-->
            <p>这是一个标签,没有指定slot</p>
            <footer slot="footer">这是一个h5新增的footer标签</footer>
        </child2>
        <child3>
            <template slot-scope="prop">
                <p>备注:没有slot-scope,那么该范围的变量都是父级作用域的,有slot-scope,那么相当于使用的是给slot中绑定的变量</p>
                <p>显示插槽中的text:{{prop.text}}</p>
                <p>显示插槽中的num:{{prop.num}}</p>
            </template>
        </child3>
    </div>
</body>
<template id="child1">
    <div id="wrapper1">
        <h1>这是子组件1</h1>
        <!-- 用来接收写到子组件标签内部的内容,放到slot当中 -->
        <slot>当你不写内容时,会显示</slot>
    </div>
</template>
<!--具名插槽-->
<template id="child2">
    <div id="wrapper2">
        <slot name="header"></slot>
        <slot name="main"></slot>
        <slot></slot>
        <slot name="footer"></slot>
    </div>
</template>
<!--作用域插槽-->
<template id="child3">
    <div id="wrapper3">
        <slot :text="szStr" :num="nNum"></slot>
    </div>
</template>

</html>

<script>
    /*
     * 使用slot插槽,可以更好的实现组件复用
     */

    let child1 = {
        template: '#child1'
    };
    let child2 = {
        template: '#child2'
    };
    let child3 = {
        template: '#child3',
        data() {
            return {
                szStr: '幸福',
                nNum: 137
            }
        }
    };

    new Vue({
        el: '#app',
        components: {
            child1,
            child2,
            child3
        },
        data: {
            msg: '+摘要'
        }
    })
</script>

猜你喜欢

转载自blog.csdn.net/qq_41115965/article/details/80763257
今日推荐