插槽

suaxi
2022-07-17 / 0 评论 / 40 阅读 / 正在检测是否收录...
  1. 定义:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信方式(父 ---> 子)
  2. 分类:默认、具名、作用域
  3. 使用方式:

    (1)默认插槽

    <!-- 父组件 -->
    <Category>
        <div>
            html结构
        </div>
    </Category>
    
    <!-- 子组件 -->
    <template>
      <div class="category">
        <!-- 定义一个插槽,当使用者没有传递具体结构时,使用默认值填充 -->
        <slot>默认插槽</slot>
      </div>
    </template>

    (2)具名插槽

    <!-- 父组件 -->
    <Category>
        <template v-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>

    (3)作用域插槽

    ​ a. 定义:数据在组件的自身,但数据生成的结构由组件的使用者决定(list数据在Category 组件中,但使用数据遍历出来的结构由App组件决定)

    ​ b. 使用:

    <!-- 父组件 -->
    <Category>
        <template slot-scope="{games}">
            <ul>
                <!-- 无序列表 -->
                <li v-for="(item,index) in games" :key="index">{{ item }}</li>
            </ul>
        </template>
    </Category>
    
    <Category>
        <template slot-scope="{games}">
            <ol>
                <!-- 有序列表 -->
                <li v-for="(item,index) in games" :key="index">{{ item }}</li>
            </ol>
        </template>
    </Category>
    
    <!-- 子组件 -->
    <template>
      <div>
        <!-- 定义一个插槽,当使用者没有传递具体结构时,使用默认值填充 -->
        <slot :games="games">默认插槽</slot>
      </div>
    </template>
    
    <script>
    export default {
      name: "MyCategory",
      // 数据在组件自身
      data() {
        return {
          games: ['魔兽争霸', 'QQ飞车', 'Dota自走棋', '地下城与勇士']
        }
      }
    }
    </script>

    注:作用域插槽也可以添加name属性,使用时同理具名插槽

0

评论 (0)

取消