首页 > 其他 > 详细

Vue插槽

时间:2020-12-01 08:59:30      阅读:31      评论:0      收藏:0      [点我收藏+]
  1. 插槽内容

    • 简单的插槽:slot标签内会渲染出"插槽内容"

      <div id="app">
          <p>{{message}}</p>
          <item-list :items=‘items‘>
              插槽内容
          </item-list>
      </div>
      <script>
          Vue.component(‘item-list‘, {
              props:[‘items‘],
              template:`
                  <div>
                      <ul>
                          <li v-for=‘item in items‘>{{item}}</li>
                      </ul>
                      <slot></slot>
                  </div>
              `,
          })
          const app = new Vue({
              el:‘#app‘,
              data() {
                  return {
                      items:[‘HTML‘,‘JS‘,‘CSS‘],
                      message:‘列表‘,
                  }
              },
          })
      </script>
      
    • 编译作用域:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的

      <div id="app">
          <p>{{message}}</p>
          <item-list :items=‘items‘>
              <!-- 依然渲染的是"列表" -->
              {{message}}
          </item-list>
      </div>
      <script>
          Vue.component(‘item-list‘, {
              props:[‘items‘],
              template:`
                  <div>
                      <ul>
                          <li v-for=‘item in items‘>{{item}}</li>
                      </ul>
                      <slot></slot>
                  </div>
              `,
              data(){
                  return {
                      message:‘aaaaaa‘
                  }
              }
          })
          const app = new Vue({
              el:‘#app‘,
              data() {
                  return {
                      items:[‘HTML‘,‘JS‘,‘CSS‘],
                      message:‘列表‘,
                  }
              },
          })
      </script>
      
    • 默认内容

      <div id="app">
          <p>{{message}}</p>
          <item-list :items=‘items‘>
              <!-- 没有内容,默认显示子组件slot标签内的内容,有内容则优先显示这里的内容 -->
          </item-list>
      </div>
      <script>
          Vue.component(‘item-list‘, {
              props:[‘items‘],
              template:`
                  <div>
                      <ul>
                          <li v-for=‘item in items‘>{{item}}</li>
                      </ul>
                      <slot>{{message}}</slot>
                  </div>
              `,
              data(){
                  return {
                      message:‘aaaaaa‘
                  }
              }
          })
          const app = new Vue({
              el:‘#app‘,
              data() {
                  return {
                      items:[‘HTML‘,‘JS‘,‘CSS‘],
                      message:‘列表‘,
                  }
              },
          })
      </script>
      
  2. 具名插槽

    • <slot> 元素的name属性 可以用来定义额外的插槽

      <div id="app">
          <p>{{message}}</p>
          <item-list :items=‘items‘>
              <template v-solt:header>
                  <p>header</p>
              </template>
              <p>main</p>
              <template v-solt:footer>
                  <p>footer</p>
              </template>
          </item-list>
      </div>
      <script>
          Vue.component(‘item-list‘, {
              props:[‘items‘],
              template:`
                  <div>
                      <slot name=‘header‘>
                      <slot><slot>
                      <slot name=‘footer‘><slot>
                  </div>
              `,
              data(){
                  return {
                      message:‘aaaaaa‘
                  }
              }
          })
          const app = new Vue({
              el:‘#app‘,
              data() {
                  return {
                      items:[‘HTML‘,‘JS‘,‘CSS‘],
                      message:‘列表‘,
                  }
              },
          })
      </script>
      
    • 一个不带 name<slot> 出口会带有隐含的名字“default”

      <template v-solt:default>
          <p>main</p>
      </template>
      
    • 注意 :v-slot 只能添加在 <template> 上 (只有一种例外情况)

  3. 作用域插槽

    • 插槽 prop

      <div id="app">
          <p>{{message}}</p>
          <item-list>
              <template v-slot:default="slotProps">
                  {{ slotProps.user.two }}
              </template>
          </item-list>
      </div>
      <script>
          Vue.component(‘item-list‘, {
              template:`
                  <div>
                      <slot :user=‘user‘>{{user.one}}</slot>
                  </div>
              `,
              data(){
                  return {
                      user:{
                          one:‘first‘,
                          two:‘last‘
                      }
                  }
              }
          })
          const app = new Vue({
              el:‘#app‘,
              data() {
                  return {
                      items:[‘HTML‘,‘JS‘,‘CSS‘],
                      message:‘列表‘,
                  }
              },
          })
      </script>
      
    • 独占默认插槽的缩写语法

      <item-list>
          <template v-slot:default="slotProps">
              {{ slotProps.user.two }}
          </template>
      </item-list>
      
      <item-list v-slot:default="slotProps">
         {{ slotProps.user.two }}
      </item-list>
      
    • 默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确;只要出现多个插槽,请始终为所有的插槽使用完整的基于 <template> 的语法

      <current-user>
        <template v-slot:default="slotProps">
          {{ slotProps.user.firstName }}
        </template>
      
        <template v-slot:other="otherSlotProps">
          ...
        </template>
      </current-user>
      
    • 解构插槽 Prop

      <item-list v-slot:default="{user}">
          {{ user.two }}
      </item-list>
      <!-- 指定默认值-->
      <item-list v-slot:default="{user = { two: ‘Guest‘ }}">
          {{ user.two }}
      </item-list>
      
  4. 其他

    • 动态插槽名

      <base-layout>
        <template v-slot:[dynamicSlotName]>
          ...
        </template>
      </base-layout>
      
    • 具名插槽的缩写:把参数之前的所有内容 (v-slot:) 替换为字符 #

      <base-layout>
        <template #header>
          <h1>Here might be a page title</h1>
        </template>
      	
        <template #default="{ user }">
          <p>{{ user.firstName }}</p>
        </template>
        
        <template #footer>
          <p>Here‘s some contact info</p>
        </template>
      </base-layout>
      

Vue插槽

原文:https://www.cnblogs.com/EricZLin/p/14065814.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!