组件间通信--插槽

插槽(slot)可以实现父与子组件间通信,即想让父组件在指定位置插入一些信息。

插槽分为三种:默认插槽、具名插槽、作用域插槽

默认插槽

子组件代码:

   <h1>我是子组件默认插槽--父组件中子组件标签中的数据会放入slot中</h1>
   <!-- 默认插槽 -->
   <slot></slot>

父组件代码:

    <Test>
        <div>
          <pre>大即将到期浪淘尽,千古分流人物,还看今朝,好好学习,厚积薄发</pre>
        </div>
    </Test>

 具名插槽

子组件中,slot增加name属性

<h1>具名插槽填充数据</h1>
   <slot name="a"></slot>
   <slot name="b"></slot>

 父组件中,使用template标签指定具体的v-slot来表示插槽位置

        <template v-slot:a>
          <div>
              <div>我是往具名插槽a中填充的内容</div>
          </div>
        </template>

        <template v-slot:b>
          <div>
              <div>我是往具名插槽b中填充的内容</div>
          </div>
        </template>

 作用域插槽

指可以传递数据的插槽,子组件可以将数据传回给父组件,父组件决定这些回传数据

另外:以下代码可以学习一下,给style添加动态的属性,如果item.done是false那么color为green,否则color为red

<!-- style  动态表达式 可以学习一下 冒号后面就可以写表达式包括三元运算符 -->
<li
    :style="{color: item.done ? 'green' : 'red'}"
    v-for="(item, index) in todo"
    :key="item.id"
>
    {{ item.title }}
</li>

子组件:

props接收来的参数后,通过$row来返回给父组件

子组件代码:

<h1>作用域插槽</h1>
<ul>
    <li
        v-for="(item, index) in todo"
        :key="item.id"
    >
        <!-- 作用域插槽的特点:可以将数据回传给父组件 -->
        <slot :$row="item"></slot>
    </li>
</ul>

 

 父组件:使用template中的v-slot接收子组件的参数,并重新渲染会子组件

<template>
    <div>
        <h1>slot</h1>
        <Test1 :todo="todo">
            <template v-slot="{ $row}">
                <div>
                    <!-- 下面是子组件回传过来的数据 -->
                    <span :style="{color:$row.done? 'green' : 'red'}"
                        >{{ $row.title }}</span
                    >
                </div>
            </template>
        </Test1>

        <Test>
            <div>
                <pre>
大即将到期浪淘尽,千古分流人物,还看今朝,好好学习,厚积薄发</pre
                >
            </div>
            <template v-slot:a>
                <div>
                    <div>我是往具名插槽a中填充的内容</div>
                </div>
            </template>

            <template v-slot:b>
                <div>
                    <div>我是往具名插槽b中填充的内容</div>
                </div>
            </template>
        </Test>
    </div>
</template>

<script setup lang="ts">
import Test from "./Test.vue";
import Test1 from "./Test1.vue";
// 插槽:默认插槽、具名插槽、作用域插槽
// 作用域插槽:可以传递数据的插槽,子组件可以将数据传回给父组件,父组件决定这些回传数据

import { ref } from "vue";
let todo = ref([
    { id: 1, title: "吃饭", done: true },
    { id: 2, title: "睡觉", done: false },
    { id: 3, title: "打豆豆", done: true },
    { id: 4, title: "编程", done: false },
]);
</script>

<style scoped></style>

 

posted @ 2024-10-10 15:07  洛飞  阅读(4)  评论(0编辑  收藏  举报