当前位置: 首页 > article >正文

父子通信以及Props的使用

在 Vue 中,父子组件通信是指父组件和子组件之间如何传递数据。Vue 提供了几种方式来实现父子组件之间的通信,其中 父向子通信 是最常用的一种。

父向子通信

父向子通信的方式是通过 props(属性)来实现的。父组件将数据传递给子组件,子组件通过 props 接收这些数据。

1. 父组件传递数据给子组件

父组件通过在子组件标签上绑定 props 来传递数据给子组件。子组件通过 props 接收这些数据,并在模板中进行渲染。

示例:
父组件(App.vue
<template>
  <div>
    <h1>{{ message }}</h1>
    <!-- 向子组件传递 message -->
    <MyButton :label="message" />
  </div>
</template>

<script>
import MyButton from './components/MyButton.vue';

export default {
  components: {
    MyButton
  },
  data() {
    return {
      message: 'Click Me'
    };
  }
};
</script>

子组件(MyButton.vue

<template>
  <button>{{ label }}</button>
</template>

<script>
export default {
  // 接收父组件传递的 prop
  props: ['label']
};
</script>

解释:

  1. 父组件(App.vue
    • data 中定义了一个 message 属性,内容是 'Click Me'
    • 在模板中,使用 :label="message" 绑定 message 数据,将其传递给子组件 MyButton
  2. 子组件(MyButton.vue
    • 子组件通过 props 接收父组件传递的数据。这里定义了一个名为 label 的 prop。
    • 在模板中,使用 {{ label }} 渲染父组件传递过来的数据。

2. 父向子通信的注意事项

  • 只读性props 是单向数据流的,意味着子组件不能直接修改父组件传递的 props 数据。如果需要在子组件中修改这些数据,应通过 事件v-model 进行通信。

  • 默认值:你可以在子组件中为 props 设置默认值或类型验证,防止父组件没有传递数据时引发错误。

示例:设置默认值

props: {
  label: {
    type: String,
    default: 'Default Label'  // 如果父组件没有传递 label,子组件会使用默认值
  }
}

示例:设置类型验证

props: {
  label: {
    type: String,
    required: true  // 确保父组件传递了该属性
  }
}

3. 父组件向子组件传递复杂数据

父组件不仅可以传递简单的数据(如字符串、数字),还可以传递对象、数组、函数等复杂类型的数据。

例子:传递对象数据
<!-- 父组件 -->
<template>
  <div>
    <MyButton :info="buttonInfo" />
  </div>
</template>

<script>
import MyButton from './components/MyButton.vue';

export default {
  components: {
    MyButton
  },
  data() {
    return {
      buttonInfo: {
        label: 'Click Me',
        color: 'blue'
      }
    };
  }
};
</script>

<!-- 子组件 -->
<template>
  <button :style="{ backgroundColor: info.color }">{{ info.label }}</button>
</template>

<script>
export default {
  props: {
    info: {
      type: Object,
      required: true
    }
  }
};
</script>

解释

事件机制

在 Vue 中,子组件可以通过 $emit 方法触发自定义事件,将数据传递给父组件。这个机制类似于浏览器的事件系统:子组件触发某个事件,父组件监听并响应。

  • $emit:用于在子组件中触发自定义事件,并且可以传递参数(如 'i am mt')。
  • 事件名('changeTitle':这是你自定义的事件名称,父组件可以监听这个事件来做相应处理。
@changeTitle="updateTitle" @changeTitle

@changeTitle="updateTitle" 是 Vue 的 事件绑定 语法,用于监听子组件触发的 changeTitle 事件,并调用父组件中的 updateTitle 方法来处理该事件。

解析 @changeTitle="updateTitle"
  1. @changeTitle:这部分表示监听子组件触发的 changeTitle 事件。@ 是 Vue 的 事件绑定的缩写,它等价于 v-on:changeTitle,用于在父组件中监听子组件发出的事件。

    • @changeTitle:表示监听事件名称为 changeTitle 的事件。
    • 在子组件中,$emit('changeTitle', ...) 触发的事件名就是 'changeTitle'
  2. "updateTitle":这是当 changeTitle 事件被触发时,父组件需要调用的 方法名。这个方法会在事件发生时被调用,父组件会传递来自子组件的数据(如果有的话)到这个方法。

@changeTitle 是监听名字是changeTitle 的事件吗 可是父类里面没定义这个事件 是子传过来的? 

@changeTitle 确实是监听一个名为 changeTitle 的事件,但父组件并不需要显式地定义这个事件。事件的定义和触发发生在子组件中,父组件只是监听并处理这个事件。

关键点

  • 子组件通过 $emit('changeTitle', ...) 触发 changeTitle 事件,并将数据传递给父组件。
  • 父组件使用 @changeTitle="updateTitle" 来监听子组件发出的 changeTitle 事件。
  • 在父组件中并不需要显式地定义 changeTitle 事件,而是动态地监听子组件通过 $emit 发出的事件

事件的流向

  1. 子组件触发事件: 子组件通过 this.$emit('changeTitle', 'some data') 触发一个名为 changeTitle 的事件,并可以传递数据(如 'some data')给父组件。

  2. 父组件监听事件: 父组件使用 @changeTitle="updateTitle" 来监听子组件发出的 changeTitle 事件。当子组件触发该事件时,父组件会调用 updateTitle 方法,并将事件中传递的数据传给它。


http://www.kler.cn/a/417382.html

相关文章:

  • 【开源免费】基于Vue和SpringBoot的技术交流分享平台(附论文)
  • 使用 `aircrack-ng`扫描、获取握手包
  • CPU进行float16计算,C++的half.hpp使用方式FP16运算
  • Maven install java heap space
  • C++游戏开发入门:如何从零开始实现自己的游戏项目?
  • IIC和SPI的时序图
  • Android studio 利用cmake编译和使用so文件
  • 【K230 CanMV】machine.FPIOA、Pin 与 GPIO 全解析
  • 自然语言处理基础之文本预处理
  • C/C++中的调用约定
  • 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  • 下载maven 3.6.3并校验文件做md5或SHA512校验
  • 深度学习中的梯度下降算法:详解与实践
  • Flink-State状态
  • 【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习
  • sizeof和strlen区分,(好多例子)
  • hive3.1.3安装及基本例子
  • JS怎么实现Module模块化?
  • neo4j5.25,jdk21,eclipse下载安装全配置
  • SpringBoot生成顺序规则编号-查询数据库方式实现
  • JAVA变量类型
  • hCaptcha 图像识别 API 对接说明
  • Python系列 - MQTT协议
  • 【UE5 C++课程系列笔记】06——定时器的基本使用
  • 曲面单值化定理
  • Flutter EventBus