vue插槽

插槽

  1. 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件

  2. 分类:默认插槽、具名插槽、作用域插槽

  3. 使用方式:

1. 默认插槽:

vue       父组件中:               <Category>                  <div>html结构1</div>               </Category>       子组件中:               <template>                   <div>                      <!-- 定义插槽 -->                      <slot>插槽默认内容...</slot>                   </div>               </template>      

image-20220729100322339

image-20220729100405188
   
      >     ​    可以看到,在父组件的子组件标签中存在内容时,子组件插槽中的默认内容就不会展示,但在父组件的子组件标签中没有内容的时候,就会显示插槽中的默认内容
   
      image-20220729100730866
   
      image-20220729100749748
   
   2. 具名插槽:
   
      vue       父组件中:               <Category>                   <template slot="center">                     <div>html结构1</div>                   </template>                          <template v-slot:footer>                      <div>html结构2</div>                   </template>               </Category>       子组件中:               <template>                   <div>                      <!-- 定义插槽 -->                      <slot name="center">插槽默认内容...</slot>                      <slot name="footer">插槽默认内容...</slot>                   </div>               </template>      
   
      image-20220729101631394
   
      ​                                                                  image-20220729101944151     
   
      > ​    显而易见的,在父组件中,slot有两种写法 , slot =‘xxx’ 和 v-slot:xxx ; 
      >
      > ​    其次,插槽并非捆绑 template 标签 使用, 但是考虑到标签本身携带的特性,在template 标签中使用基本上可以应对所有情况. 而且绑定在其他标签上还有可能出现下面这种情况:
   
      image-20220729102753024
   
      image-20220729102814541
   
      >     ​    绑定在div上的box1 并没有照预期的一样显示 slot:box1中的默认数据,而是整个消失了,在页面中对应位置甚至没有出现空的div标签,说明使用类似标签来绑定slot的时候大概也会出现类似的问题,即,即便绑定的容器是空的,也一样会使用这个容器的内容,而非子组件插槽的默认内容
   
      
   
   3. 作用域插槽:
   
      1. 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
   
      2. 具体编码:
   
         vue          父组件中:                <Category>                   <template scope="scopeData">                      <!-- 生成的是ul列表 -->                      <ul>                         <li v-for="g in scopeData.games" :key="g">{{g}}</li>                      </ul>                   </template>                </Category>                          <Category>                   <template slot-scope="scopeData">                      <!-- 生成的是h4标题 -->                      <h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>                   </template>                </Category>          子组件中:                  <template>                      <div>                          <slot :games="games"></slot>                      </div>                  </template>                                  <script>                      export default {                          name:'Category',                          props:['title'],                          //数据在子组件自身                          data() {                              return {                                  games:['红色警戒','穿越火线','劲舞团','超级玛丽']                              }                          },                      }                  </script>          
         
         image-20220729104035808

​                    image-20220729104050523 子组件数据:image-20220729104333581

​    首先来看到子组件这边 很明显是对games进行了绑定,但并没有对数据的样式做出规定,而父组件这边不仅从子组件中获取了数据,同时还可以对数据的格式做出规定,但要注意的是,在一个子组件下,绑定同一条数据的话,后面规定的样式会覆盖前面的样式

image-20220729104742284image-20220729104834118

​    当然,上面这个问题可以通过与具名插槽连用来解决,但是存在一个问题,只有slot='xxx’能够生效,至少我测试的时候 v-slot:xxx  没有反应

image-20220729105300145image-20220729105552126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值