Vue item_14 之slot详解

好的代码会说话,码上见

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>vue item_14 slot</title>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
</head>
<body>
    <div>
    <p>slot标签 基于组件模板内 </p>
    <p>slot特性可在组件 或 普通元素上 其值指向slot的具名</p>
    <p>
        vue组件由template,css,script 三部分构成
    </p>
    <p>
        slot存在于template中,存在于组件标签内的内容会被分发到template中对应的slot标签元素
    </p>
    <p>
        插槽内容可以包含任何html或其他组件模板代码
    </p>
</div>
<hr>
    <div id="app1">
         <navigation-link url="/profile">
            Your Profile 内容会被分发到组件模板上去<br>
            <span class="fa fa-user">前提是组件模板上必须有slot元素</span>
            <br>
            <strong>slot位置也可以嵌套Vue组件模板</strong>
            <noslot-nav></noslot-nav>
        </navigation-link>
        <div></div>
        <noslot-nav>我要显示没用slot元素,其实我是被丢弃,在页面看不到</noslot-nav>
    </div>

    <div id="app2">
        <hr>
        slot元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:
        <hr>

        <p>
            具名插槽使用在组件上
        </p>
        <base-layout>
            <dhead slot="header"></dhead>
            <p>A paragraph for the main content.</p>
            <p>非具名插槽内容And another one.</p>
            <foot slot="footer"></foot>
        </base-layout>
        <hr>
        <p>
                具名插槽使用在使用在普通元素上
        </p>
        <base-layout>
            无名分会进入默认插槽--- 
            <p slot="header">我是头</p>
            自由民<br>
            <p slot="footer">我是尾</p>
        </base-layout>
    </div>
    <hr>
    <div id="app3">

        <default-slot>
            <p slot="hehe">会出现默认值button</p>
        </default-slot>
        <default-slot>
            我是内容肯定会被button收编,可怜的默认值
        </default-slot>
    </div>

    <div id="app4">
        <p>
            父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。
        </p>

    </div>

    <script>

        // 带slot局部组件
        var NavigationLink = {
            template:`
            <div>
                <a
                    v-bind:href="url"
                    class="nav-link"
                >
                <slot></slot>
                </a>
            </div>
            `,
            props:['url']
        }

        // 不带slot的组件
        var NoslotNav = {
            template:`
                <div class=" NoslotNav"> 我是没有包含一个 slot 元素的NoslotNav组件,在我的组件标签间传入的内容,不会显示的</div>
            `
        }

        // 使用插槽
        new Vue({
            components:{ NavigationLink, NoslotNav }
            // 实例方法
        }).$mount('#app1')

        // 作用 
        // 将组件元素标签的内容分发到模板slot位置


        ////////////////////// 具名插槽 /////////////////////

        // 父组件定义布局
        var baseLayout = {
            template:`
            <div class="container">
                <header>
                    <slot name="header"></slot>
                </header>
                <main>
                    <slot></slot>
                </main>
                <footer>
                    <slot name="footer"></slot>
                </footer>
            </div>
            `
        }

        // 子组件 头
        var dhead = {
            template:`
            <h1>Here might be a page title</h1>
            `
        }

        // 子组件尾
        var foot = {
            template:`
            <p>Here's some contact info</p>
            `
        }

        // 使用具名插槽
        new Vue({
            'el':'#app2',
            components:{baseLayout,dhead,foot}
        })

        // ------ 插槽的默认内容-----------
        var defaultSlot = {
            template:`
            <div>
            <button type="submit">
                <slot>Submit</slot>
            </button>
            <slot name='hehe'></slot>
            </div>
            `
        }

        // 不给插槽内容,显示默认
        new Vue({
            el:'#app3',
            components:{defaultSlot}
        })

        // 

    </script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/u011584949/article/details/80771617