插槽

(1)插槽内容

    Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 <slot> 元素作为承载分发内容的出口。

    在父级组件里可以这样写

    <div class="slot_area">
        <navigation-link v-bind:url="url">
            Your Profile你的个人简介资料
        </navigation-link>
    </div>

    然后在 <navigation-link> 组件模板中:

        Vue.component('navigation-link',{
            props:['url'],
            template:`<a v-bind:href="url" class="nav-link">
                        <span class="slot_span"></span>
                        <slot></slot>
                    </a>`
        });

          new Vue({
              el:'.slot_area',
              data:{
                  url:'http://www.baidu.com'
              }
          })

 

    当组件渲染的时候,<slot></slot> 将会被替换为“Your Profile你的个人简介资料”。

    

    插槽内可以包含任何模板代码,包括 HTML:

        Vue.component('navigation-link',{
            props:['url'],
            template:`<a v-bind:href="url" class="nav-link">
<!-- 添加一个 Font Awesome 图标 --> <span class="fa fa-user"></span> <slot></slot> </a>` });

    

    插槽也可以是其他组件

    <div class="slot_area">
        <navigation-link v-bind:url="url">
            Your Profile你的个人资料简介
            <slot-component></slot-component>
        </navigation-link>
    </div>
    
    <script type="text/javascript">
        Vue.component('navigation-link',{
            props:['url'],
            template:`<a v-bind:href="url" class="nav-link">
                        <!-- 添加一个 Font Awesome 图标 -->
                        <span class="slot_span"></span>
                        <slot></slot>
                    </a>`
        });
        Vue.component('slot-component',{
            template:'<h4>插槽可以是其他模板</h4>'
        })
        new Vue({
            el:'.slot_area',
            data:{
                url:'http://www.baidu.com'
            }
        })
    </script>

    结果:

  

    注意:如果 <navigation-link> 没有包含一个 <slot> 元素,则该组件起始标签和结束标签之间的任何内容都会被抛弃。即如果模板中没有slot插槽元素,则在父级组件里加的内容都会被抛弃。

(2)编译作用域

    当你想在一个插槽中使用数据时,例如:

    <!-- 2、编译作用域 -->
    <div class="scrop_area">
        <scrop-area>
            插槽显示内容,时间{{blog.date}}
        </scrop-area>
    </div>

    该插槽跟模板的其它地方一样可以访问相同的实例属性 (也就是相同的“作用域”),而不能访问 <scrop-area> 的作用域

    <div class="scrop_area">
        <scrop-area title="鼠标悬停展示信息">
            插槽显示内容,时间{{blog.date}},title为{{title}}
        </scrop-area>
    </div>

待解答:

    <div class="scrop_area">
        <scrop-area v-bind:title="blog.title">
            插槽显示内容,时间{{blog.date}},title为{{title}}
        </scrop-area>
    </div>
        Vue.component('scrop-area',{
            props:['blog'],
            template:`<div>
                    <span>你好</span>
                    <slot></slot>
                    </div>`
        })
        new Vue({
            el:".scrop_area",
            data:{
                blog:{
                    date:'2019.08.21',
                    title:"鼠标悬停展示信息"
                }
            }
        })

 

.

猜你喜欢

转载自www.cnblogs.com/jianxian/p/10604719.html
今日推荐