• Vue 父子组件传参、插槽


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

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

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

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

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

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

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

    父组件

    1. <template>
    2. <h1>我是父组件h1>
    3. <hr />
    4. <Child :name="info.name" sex="男" :age="info.age">Child>
    5. template>
    6. <script>
    7. import { reactive } from 'vue';
    8. // 1.引入子组件
    9. import Child from '../components/Child.vue';
    10. export default {
    11. name: "Parent",
    12. // 2.注册子组件
    13. components: { Child },
    14. setup() {
    15. let info = reactive({
    16. name: "张三",
    17. age: 18
    18. })
    19. // 返回数据
    20. return { info }
    21. }
    22. }
    23. script>

    子组件

    1. <template>
    2. <h1>我是子组件h1>
    3. <p>姓名:{{ props.name }}p>
    4. <p>性别:{{ props.sex }}p>
    5. <p>年龄:{{ props.age }}p>
    6. template>
    7. <script>
    8. export default {
    9. name: "Child",
    10. // 接收数据,未接收的数据不会在 props 参数中显示
    11. props: ['name', 'sex'],
    12. setup(props, context) {
    13. console.log(props);
    14. // 返回数据
    15. return { props }
    16. }
    17. }
    18. script>


    效果

     props 参数的几种接收方式

    无限制接收

    props: ['name', 'sex', 'age']

    限制数据类型接收

    1. props: {
    2. name: String,
    3. age: Number,
    4. sex: String
    5. }

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

    1. props: {
    2. name: {
    3. type: String,
    4. required: true // 是否必填
    5. },
    6. age: {
    7. type: Number,
    8. required: true // 是否必填
    9. },
    10. sex: {
    11. type: String,
    12. default: '保密' // 设置默认值
    13. }
    14. }

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

    父组件:

    1. <template>
    2. <h1>我是子组件h1>
    3. <p>姓名:{{ props.name }}p>
    4. <p>性别:{{ props.sex }}p>
    5. <p>年龄:{{ props.age }}p>
    6. template>
    7. <script>
    8. export default {
    9. name: "Child",
    10. // 假设父组件传递了 name、age、sex 三个数据,props 只接收 name 数据
    11. props: ['name'],
    12. setup(props, context) {
    13. // 那么 props 未接收的数据会在 attrs 属性中显示
    14. console.log(context.attrs);
    15. // 返回数据
    16. return {
    17. props
    18. }
    19. }
    20. }
    21. script>

    效果:

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

    父组件

    1. <template>
    2. <h1>我是父组件h1>
    3. <hr />
    4. <Child>
    5. <p>姓名:{{ info.name }}p>
    6. <p>年龄:{{ info.age }}p>
    7. Child>
    8. template>
    9. <script>
    10. import { reactive } from 'vue';
    11. import Child from '../components/Child.vue';
    12. export default {
    13. name: "Parent",
    14. components: { Child },
    15. setup() {
    16. let info = reactive({
    17. name: "张三",
    18. age: 18
    19. })
    20. // 返回数据
    21. return { info }
    22. }
    23. }
    24. script>

    子组件:

    1. <template>
    2. <h1>我是子组件h1>
    3. <slot>默认值slot>
    4. template>
    5. <script>
    6. export default {
    7. name: "Child",
    8. setup(props, context) {
    9. // 父组件传递过来的插槽内容,会存放在 slots 属性中
    10. console.log(context.slots);
    11. }
    12. }
    13. script>

     

    效果:

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

    父组件

    1. <template>
    2. <h1>我是父组件h1>
    3. <hr />
    4. <Child @myEvent="myInfo">Child>
    5. template>
    6. <script>
    7. import Child from '../components/Child.vue';
    8. export default {
    9. name: "Parent",
    10. components: { Child },
    11. setup() {
    12. // 接收父组件传递的数据
    13. let myInfo = (value) => {
    14. alert(`我是父组件,我收到数据了,值为:${value}`);
    15. }
    16. // 返回数据
    17. return { myInfo }
    18. }
    19. }
    20. script>

     子组件:

    1. <template>
    2. <h1>我是子组件h1>
    3. <button @click="test">往父组件中传递数据button>
    4. template>
    5. <script>
    6. export default {
    7. name: "Child",
    8. // 声明自定义事件
    9. emits: ['myEvent'],
    10. setup(props, context) {
    11. let test = () => {
    12. // 调用自定义事件,语法为:context.emit('自定义事件', 值);
    13. context.emit('myEvent', 666);
    14. }
    15. // 返回数据
    16. return { test }
    17. }
    18. }
    19. script>

    效果

     

    原创作者:吴小糖

    创作时间:2023.10.26 

  • 相关阅读:
    《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启
    USACO Guide银组3. 自定义比较器和坐标压缩
    【WLAN】Android 13 WiFi Display 介绍和常规问题分析
    2022/7/20 LocalDateTime将年月日转化为时间戳
    MyBatis框架简介
    用友YonSuite驶入快车道 SaaS数智飞轮驱动高效增长
    Turbo译码部分的迭代停止准则
    【无标题】
    怎么在stm32上跑自己的神经网络
    索引失效的几种情况
  • 原文地址:https://blog.csdn.net/xiaowude_boke/article/details/134066515