7.4使用slot分发内容

2019-03-03  本文已影响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>
上一篇下一篇

猜你喜欢

热点阅读