美文网首页
7.4使用slot分发内容

7.4使用slot分发内容

作者: 咸鱼前端 | 来源:发表于2019-03-03 15:07 被阅读0次

    7.4.2作用域

    • 父组件模板的内容是在父组件作用域内编译,子组件模板的内容是在子组件作用域内编译
    • 如果想数据在子组件上绑定,那应该是:
    <script>
    Vue.component("child-component", {
      template: `<div v-show="showChild">子组件</div>`,
      data () {
        return {
          showChild: true
        }
      }
    });
    </script>
    

    7.4.3slot用法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>7.4slot用法</title>
        <style>
        [v-cloak]{
            display: none;
        }
    </style>
    </head>
    <body>
        <div id="app" v-cloak>
            <child></child>
            <br>
            <br>
            <child-component>
                <h2 slot="header">标题</h2>
                <p>正文内容</p>
                <p>更多的正文内容</p>
                <div slot="footer">底部信息</div>
            </child-component>
            <br>
            <br>
            <my-list :books="books">
                <template scope="props" slot="book"><!-- 先写好 "props" 用来传递数据,之后是具名slot -->
                    <li>{{ props.bookName }}</li><!-- 将书名渲染出来 -->
                </template>
            </my-list>
        </div>
        <script type="text/javascript" src="/node_modules/vue/dist/vue.js"></script>
        <script type="text/javascript">
            /*1.单个slot的用法*/
            Vue.component("child", {
                template: '\
                <div>\
                    <slot>\
                        <p>如果父组件没有插入内容,我将作为默认出现</p>\
                    </slot>\
                </div>\
                ',
                //如果HTML模板中的 <child> 标签内没有内容,"template" 中的 <p> 元素内的 "如果父组件没有插入内容..." ,渲染出来的结果就是 <div> <p>如果父组件没有插入内容...</p> </div>
            });
            /*2.具名slot*/
            Vue.component("child-component", {
                template: `\
                <div class="container">\
                    <div class="header">\
                        <slot name='header'></slot>\
                    </div>\
                    <div class="main">\
                        <slot></slot>\
                    </div>\
                    <div class="footer">\
                        <slot name='footer'></slot>\
                    </div>\
                </div>\
                `
            });
            //<div className="main"> 内的 <slot> 内有使用 name 特性,将作为默认slot出现,父组件没有slot特性的元素与内容都将会在这里出现
            //父组件使用了slot name特性的,在 template 中使用 <solt name="header"></slot> 使用
            /*3.作用域插槽*/
            Vue.component("my-list", {
                props: {
                    books: {
                        type: Array,
                        default: function () {
                            return [];
                        }
                    }
                },
                template: `\
                <ul>\
                    <slot name="book" v-for="book in books" :book-name="book.name"></slot>\
                </ul>\
                `//利用slot "name" 特性,指定名称元素,"v-for" 渲染 "books","book-name" 动态绑定上每一条数据的 "name"
            })
            var vm = new Vue({
                el: "#app",
                data: {
                    books: [
                    { name: "《Vue.js实战》" },
                    { name: "《JavsScript语言精粹》" },
                    { name: "《JavaScript》高级程序设计" }]
                }
            })
        </script>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:7.4使用slot分发内容

          本文链接:https://www.haomeiwen.com/subject/jinpuqtx.html