Vue.js 基础学习之插槽slot

在组件中用slot插槽可以使组件中添加的内容可改,若直接定义组件,则组件中的内容只能在组件中改动,但是如果用上slot插槽便不同了

如:

<div id="app">
    <panel></panel>
    </div>
    <template id="panel-tpl">
        <div class="panel" style="width: 500px;border: 1px solid #999;">
        <div class="title" style="padding: 15px;border-bottom: 1px solid #999;">{{title}}</div>
        <div class="content" style="padding: 15px;">{{content}}</div>
        <div class="footer" style="padding: 15px; border-top:1px solid #999;">{{footer}}</div>
    </div>
    </template>
<script>
    Vue.component('panel',{
        template : '#panel-tpl',
        data : function(){
            return {
                title : '标题',
                content : '内容',
                footer : '底部',
            };
        }
    });
    new Vue({
        el : '#app',
    });
</script>

上面这段代码便只能在组件panel内部改动各部分内容。有了slot我们便可以在外部改动了,若只有一个slot则组件标签中间的内容便是slot标签所在地方的内容

<div id="app">
    <panel>
        {{ content }}
    </panel>
    </div>
    <template id="panel-tpl">
        <div class="panel" style="width: 500px;border: 1px solid #999;">
        <div class="title" style="padding: 15px;border-bottom: 1px solid #999;">{{title}}</div>
        <div class="content" style="padding: 15px;">
        <slot></slot>
        </div>
        <div class="footer" style="padding: 15px; border-top:1px solid #999;">{{footer}}</div>
    </div>
    </template>
<script>
    Vue.component('panel',{
        template : '#panel-tpl',
        data : function(){
            return {
                title : '标题',
                content : '内容',
                footer : '底部',
            };
        }
    });
    new Vue({
        el : '#app',
        data : {
            content : '这是外部设置的内容',
        },
    });
</script>

若有多个slot,则要为每个slot设置一个name 

<div id="app">
    <panel>
        <div slot='title'>{{title}}</div>
        <div slot='content'>{{content}}</div>
        <div slot='footer'>{{footer}}</div>
    </panel>
        输入标题:<input type="text" v-model='title'>
        输入内容:<input type="text" v-model='content'>
        输入底部:<input type="text" v-model='footer'>
    </div>
    <template id="panel-tpl">
        <div class="panel" style="width: 500px;border: 1px solid #999;">
        <div class="title" style="padding: 15px;border-bottom: 1px solid #999;">
            <slot name='title'></slot>
        </div>
        <div class="content" style="padding: 15px;">
        <slot name='content'></slot>
        </div>
        <div class="footer" style="padding: 15px; border-top:1px solid #999;">
            <slot name='footer'></slot>
        </div>
    </div>
    </template>
<script>
    Vue.component('panel',{
        template : '#panel-tpl',
    });
    new Vue({
        el : '#app',
        data : {
            title : '这是外部设置的标题',
            content : '这是外部设置的内容',
            footer : '这是外部设置的底部',
        },
    });
</script>

上面这段代码可以通过input输入框动态的改变组件panel中的内容。

 

posted @ 2017-09-05 11:18  hz海内存知己  阅读(252)  评论(0编辑  收藏  举报