Vue 父子组件传参、插槽

setup 函数中有两个主要的参数:props、context 。

props 用于接收父组件传递过来的数据,父传子。

context 指的是 setup 的上下文,它有三个属性:attrs、slots、emit 。

attrs 用于:当父组件传递过来的数据,没有被 props 接收时,数据就会存放在 attrs 属性中。

slots 用于:接收父组件传递过来的插槽内容,相当于 vue2 中的 `this.$slots` 。

emit 用于:创建自定义事件函数,子传父。相当于 vue2 中的 `this.$emit` 。

setup 函数中的 props 参数【父传子】

父组件

html 复制代码
<template>
    <h1>我是父组件</h1>
    <hr />
    <!-- 3.使用子组件,并通过自定义属性传递数据 -->
    <Child :name="info.name" sex="男" :age="info.age"></Child>
</template>

<script>
import { reactive } from 'vue';
// 1.引入子组件
import Child from '../components/Child.vue';
export default {
    name: "Parent",
    // 2.注册子组件
    components: { Child },
    setup() {
        let info = reactive({
            name: "张三",
            age: 18
        })
        // 返回数据
        return { info }
    }
}
</script>

子组件

html 复制代码
<template>
  <h1>我是子组件</h1>
  <p>姓名:{{ props.name }}</p>
  <p>性别:{{ props.sex }}</p>
  <p>年龄:{{ props.age }}</p>
</template>

<script>
export default {
  name: "Child",
  // 接收数据,未接收的数据不会在 props 参数中显示
  props: ['name', 'sex'],
  setup(props, context) {
    console.log(props);
    // 返回数据
    return { props }
  }
}
</script>

效果

props 参数的几种接收方式

无限制接收

javascript 复制代码
props: ['name', 'sex', 'age']

限制数据类型接收

javascript 复制代码
props: {
  name: String,
  age: Number,
  sex: String
}

限制数据类型、默认值、是否必填接收:

javascript 复制代码
props: {
  name: {
    type: String,
    required: true // 是否必填
  },
  age: {
    type: Number,
    required: true // 是否必填
  },
  sex: {
    type: String,
    default: '保密' // 设置默认值
  }
}

context 参数中的 attrs 属性【子传父】

父组件:

html 复制代码
<template>
  <h1>我是子组件</h1>
  <p>姓名:{{ props.name }}</p>
  <p>性别:{{ props.sex }}</p>
  <p>年龄:{{ props.age }}</p>
</template>

<script>
export default {
  name: "Child",
  // 假设父组件传递了 name、age、sex 三个数据,props 只接收 name 数据
  props: ['name'],
  setup(props, context) {
    // 那么 props 未接收的数据会在 attrs 属性中显示
    console.log(context.attrs);
    // 返回数据
    return {
      props
    }
  }
}
</script>

效果:

context 参数中的 slots 属性【默认插槽】

父组件

html 复制代码
<template>
    <h1>我是父组件</h1>
    <hr />
    <Child>
        <p>姓名:{{ info.name }}</p>
        <p>年龄:{{ info.age }}</p>
    </Child>
</template>

<script>
import { reactive } from 'vue';
import Child from '../components/Child.vue';
export default {
    name: "Parent",
    components: { Child },
    setup() {
        let info = reactive({
            name: "张三",
            age: 18
        })
        // 返回数据
        return { info }
    }
}
</script>

子组件:

html 复制代码
<template>
  <h1>我是子组件</h1>
  <slot>默认值</slot>
</template>

<script>
export default {
  name: "Child",
  setup(props, context) {
    // 父组件传递过来的插槽内容,会存放在 slots 属性中
    console.log(context.slots);
  }
}
</script>

效果:

context 参数中的 emit 属性【子传父】

父组件

html 复制代码
<template>
    <h1>我是父组件</h1>
    <hr />
    <!-- 使用自定义事件 -->
    <Child @myEvent="myInfo"></Child>
</template>

<script>
import Child from '../components/Child.vue';
export default {
    name: "Parent",
    components: { Child },
    setup() {
        // 接收父组件传递的数据
        let myInfo = (value) => {
            alert(`我是父组件,我收到数据了,值为:${value}`);
        }
        // 返回数据
        return { myInfo }
    }
}
</script>

子组件:

html 复制代码
<template>
  <h1>我是子组件</h1>
  <button @click="test">往父组件中传递数据</button>
</template>

<script>
export default {
  name: "Child",
  // 声明自定义事件
  emits: ['myEvent'],
  setup(props, context) {
    let test = () => {
      // 调用自定义事件,语法为:context.emit('自定义事件', 值);
      context.emit('myEvent', 666);
    }
    // 返回数据
    return { test }
  }
}
</script>

效果

原创作者:吴小糖

创作时间:2023.10.26

相关推荐
lvchaoq24 分钟前
页面停留时间过长导致token过期问题
前端
兔老大的胡萝卜26 分钟前
pm2 部署nuxt4项目
javascript·nuxt4
阿蒙Amon28 分钟前
JavaScript学习笔记:17.闭包
javascript·笔记·学习
elangyipi12329 分钟前
深入理解前端项目中的 package.json 和 package-lock.json
前端·json
Wpa.wk31 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
l1t33 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
LYFlied41 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
composurext41 分钟前
录音切片上传
前端·javascript·css
程序员小寒42 分钟前
前端高频面试题:深拷贝和浅拷贝的区别?
前端·javascript·面试
狮子座的男孩1 小时前
html+css基础:07、css2的复合选择器_伪类选择器(概念、动态伪类、结构伪类(核心)、否定伪类、UI伪类、目标伪类、语言伪类)及伪元素选择器
前端·css·经验分享·html·伪类选择器·伪元素选择器·结构伪类