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

Vue组件通讯$attrs和$listeners例子

在Vue中,$attrs 和 $listeners 是两个非常有用的特性,它们允许你更轻松地实现组件间的通讯,特别是当你需要创建可复用的组件时。

$attrs 包含了父组件中未被子组件声明的属性 (class 和 style 除外)。当你不想在子组件中逐个声明父组件传递的属性时,你可以使用 v-bind="$attrs" 一次性地将它们传入子组件。

$listeners 包含了父组件中(不含 .native 修饰器的)v-on 事件监听器。子组件可以用 v-on="$listeners" 将事件监听器指向到内部元素上。

下面是一个使用 $attrs 和 $listeners 的例子:

父组件 (Parent.vue)

vue

<template>

  <div>

    <ChildComponent

      :name="name"

      :age="age"

      @click="handleClick"

      @custom-event="handleCustomEvent"

    />

  </div>

</template>

<script>

import ChildComponent from './ChildComponent.vue';

export default {

  components: {

    ChildComponent

  },

  data() {

    return {

      name: 'John Doe',

      age: 30

    };

  },

  methods: {

    handleClick() {

      console.log('Clicked on the child component!');

    },

    handleCustomEvent(payload) {

      console.log('Received custom event:', payload);

    }

  }

};

</script>

子组件 (ChildComponent.vue)

vue

<template>

  <div>

    <p>Name: {{ name }}</p>

    <p>Age: {{ age }}</p>

    <button @click="triggerCustomEvent">Trigger Custom Event</button>

    <!-- 使用 $attrs 传递未声明的属性 -->

    <input v-bind="$attrs" />

  </div>

</template>

<script>

export default {

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

  methods: {

    triggerCustomEvent() {

      // 触发自定义事件

      this.$emit('custom-event', { message: 'Hello from Child' });

    }

  },

  mounted() {

    // 假设你需要在子组件内部监听一些事件

    // 你也可以使用 $listeners 来监听

    // 但在这个例子中,我们直接在模板上使用了 v-on

    // 如果你想在子组件的某个内部元素上监听这些事件,你可以使用 v-on="$listeners"

  }

};

</script>

在这个例子中,Parent.vue 传递了两个属性 name 和 age,以及两个事件监听器 @click 和 @custom-event 到 ChildComponent.vue。在 ChildComponent.vue 中,我们声明了 name 和 age 作为 props,并使用 v-bind="$attrs" 将未声明的属性绑定到 <input> 元素上。虽然我们没有在子组件中声明 click 事件监听器,但由于我们使用了 v-on="$listeners"(在这个例子中我们并没有显式使用它,但在需要时可以使用),子组件仍然可以响应父组件传递的点击事件。

注意,在Vue 3中,$attrs 和 $listeners 的行为有一些变化,但基本概念和用法是相似的。在Vue 3中,你可能需要使用 <slot v-bind="$attrs"> 而不是 v-bind="$attrs" 直接在子组件的根元素上,因为Vue 3鼓励使用插槽来分发内容。

 

相关文章:

  • java新特性(Stream API)
  • 【RuoYi】使用代码生成器完成CRUD操作
  • 香橙派OrangePi AIpro,助力国产AIoT迈向新的台阶!
  • 阿里开源React应用动效解决方案:ant-motion
  • C语言#include<>和#include““有什么区别?
  • 【算法】位运算算法——丢失的数字
  • Flutter 中的 BaseLine 小部件:全面指南
  • Linux快速定位日志 排查bug技巧和常用命令
  • 06_知识点总结(JS高级)
  • 基于FPGA实现LED的闪烁——HLS
  • AURIX TC3xx单片机介绍-启动过程介绍2
  • 他用AI,抄袭了我的AI作品
  • C#--WPF自定义控件模板示例
  • mysqlbinlog解析
  • 数据分析之统计学基础
  • python3.6+scrapy+mysql 爬虫实战
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • ES6之路之模块详解
  • JavaScript-Array类型
  • javascript从右向左截取指定位数字符的3种方法
  • Redash本地开发环境搭建
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 笨办法学C 练习34:动态数组
  • 番外篇1:在Windows环境下安装JDK
  • 记录:CentOS7.2配置LNMP环境记录
  • 技术发展面试
  • 模型微调
  • 前端js -- this指向总结。
  • 全栈开发——Linux
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #图像处理
  • $.proxy和$.extend
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)linux使用docker容器运行mysql
  • (二)构建dubbo分布式平台-平台功能导图
  • (排序详解之 堆排序)
  • (一)Neo4j下载安装以及初次使用
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .NET CF命令行调试器MDbg入门(一)
  • //解决validator验证插件多个name相同只验证第一的问题
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @EnableConfigurationProperties注解使用
  • @property括号内属性讲解
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [C#] 如何调用Python脚本程序
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [CF494C]Helping People