Vue组件(插槽)

1、插槽属于Vue组件的三个核心之一,其余两个分别是属性和事件,今天主要学习插槽的使用。

2、插槽(slot):将子组件和父组件进行组合,可以弥补视图的不足。是组件具有更好的拓展性

组件的封装方式:抽取共性

3、插槽的使用方式:

(1)vue2.0之前的版本

        1️⃣匿名插槽(默认插槽):一个组件中有且只有一个插槽

<div>
    <h2>子组件</h2>
    <p>哈哈哈</p>
    <!-- 匿名插槽:预留的位置,具体做什么元素由该组件的使用者决定-->
    <slot></slot>    
</div>

        2️⃣具名插槽:

        Son.vue

<div>
    <slot name="top"></slot>
    <h2>子组件</h2>
    <p>哈哈哈</p>
    <slot name="center"></slot>
    <p>啦啦啦</p>
    <slot name="bottom"></slot>
</div>

App.vue:

<Son>
      <template v-slot:top>
        <h1>插槽</h1>
      </template>
      <template v-slot:center>
        <button>按钮</button>
      </template>
      <template v-slot:bottom>
        <select>
          <option value="#">请选择</option>
        </select>
      </template>
</Son>

        3️⃣作用域插槽:父组件显示不同的页面结构,页面中的数据来自子组件

        Menu.vue:

<template>
  <div>
    <h2>哈哈哈</h2>
    <p>啦啦啦</p>
    <slot :lang="list"></slot>
  </div>
</template>

<script>
export default {
  name: "Menu",
  data(){
    return {
      list:['JavaScript','CSS','HTML','C++','C']
    }
  }
}
</script>

        App.vue

<Menu>
	<template slot-scope="slotProps">
        {{ slotProps.lang.join('、')}}
	</template>
</Menu>

(2)vue2.6之后的版本:插槽使用统一的新的语法(<v-slot>指令),用来取代<slot>和slot-scope

        1️⃣匿名插槽(默认插槽):在父组件中使用v-slot指令

        Son.vue:

<div>
    <h2>子组件</h2>
    <p>哈哈哈</p>
    <p>啦啦啦</p>
    <slot></slot>
  </div>

        App.vue:

<Son>
      <template v-slot:default>
        <button>测试</button>
      </template>
</Son>

        2️⃣具名插槽:和老版本用法相同

        3️⃣作用域插槽:

        Menu.vue

<div>
    <h2>哈哈哈</h2>
    <p>啦啦啦</p>
    <slot :lang="list" name="st1"></slot>
    <slot :lang="list" name="st2"></slot>
  </div>
</template>

<script>
export default {
  name: "Menu",
  data(){
    return {
      list:['JavaScript','CSS','HTML','C++','C']
    }
  }
}
</script>

        App.vue

 <Menu>
      <template v-slot:st1="slotProps">
        <h2>{{ slotProps.lang.join(' --- ')}}</h2>
      </template>
    </Menu>

<!--    列表方式-->
    <Menu>
      <template v-slot:st2="slotProps">
        <ul>
          <li v-for="(item,index) in slotProps.lang" :key="index">{{ item }}</li>
        </ul>
      </template>
    </Menu>
  </div>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值