回调方法传参汇总

news2025/3/24 21:57:07

文章目录

  • 0. 引入问题
  • 1. 父子组件传值
    • 1.1 父传子:props
    • 1.2 子传父:$emit
    • 1.3 双向绑定:v-model
  • 2. 多个参数传递
  • 3. 父组件监听方法传递其他值
    • 3.1 $event
    • 3.2 箭头方法
  • 4. 子组件传递多个参数,父组件传递本地参数
    • 4.1 箭头函数 + … 扩展运算符
    • 4.2 箭头方法
  • 5. 应用

0. 引入问题

使用组件 el-switch 时,需要监控按钮的点击,触发自定义方法。通过查看API,找到组件事件 change

  • change:switch 状态发生变化时的回调函数,回调参数是新状态的值
<template>
  <el-switch v-model="value" @change="changeOpen"> </el-switch>
</template>

<script>
export default {
  data() {
    return {
      value: true
    }
  },
  methods: {
    changeOpen(val) {
      console.log(val)
    }
  }
};
</script>

在这里插入图片描述

问题1:自定义方法 changeOpen(val)val 的值从何而来?
问题2:如果需要给自定义方法 changeOpen 传其他值 怎么办?解决这些问题之前,先介绍下 Vue 组件间传值,更能理解。


1. 父子组件传值

1.1 父传子:props

父组件通过 props 传递数据,子组件接收并使用。

<!-- 父组件 -->
<ChildComponent :message="parentMessage" />

<script>
export default {
  components: {ChildComponent},
  data() {
    return { parentMessage: 'Hello from Parent!' }
  }
}
</script>

<!-- 子组件 -->
<template>
  <div>{{ message }}</div>
</template>

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

1.2 子传父:$emit

子组件通过 $emit 触发事件,父组件监听事件并处理。

<!-- 子组件 -->
<button @click="sendData">传递数据</button>

<script>
export default {
  methods: {
    sendData() {
      this.$emit('child-event', { data: 'Data from child' })
    }
  }
}
</script>

<!-- 父组件 -->
<ChildComponent @child-event="handleChildData" />

<script>
export default {
  components: {ChildComponent},
  methods: {
    handleChildData(payload) {
      console.log(payload.data) // Data from child
    }
  }
}
</script>

1.3 双向绑定:v-model

利用 v-model 简化父子组件的双向数据绑定。

<!-- 父组件 -->
<ChildComponent v-model="inputValue" />

<script>
export default {
  data() {
    return { inputValue: '默认值' }
  }
}
</script>

<!-- 子组件 -->
<template>
  <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
</template>

<script>
export default {
  props: ['modelValue']
}
</script>

v-model 本质上是 :value@input语法糖。子组件需要接收 value 属性,并在数据变化时触发 input 事件传值给父组件。

学习了父子组件传值,我们再看 问题1:自定义方法 changeOpen(val)val 的值从何而来?

change 是组件 el-switch 状态发生变化时的回调函数,内部通过 $emit 将新状态的值传递给父组件。

父组件声明自定义方法 changeOpen 监听事件并处理。changeOpen(val)val 的值即是子组件 $emit 传递的新状态的值。


2. 多个参数传递

通过对象或数组一次性传递多个值。

<!-- 子组件 Child.vue -->
<button @click="sendData">发送多个参数</button>

<script>
export default {
  methods: {
    sendData() {
      this.$emit('multi-data', '张三', 25, { city: '北京' });
    }
  }
}
</script>

<!-- 父组件 Parent.vue -->
<Child @multi-data="handleMultiData" />

<script>
export default {
  components: {Child},
  methods: {
    handleMultiData(name, age, info) {
      console.log(name, age, info.city); // 张三 25 北京
    }
  }
}
</script>

3. 父组件监听方法传递其他值

如果 changeOpen 方法需要传递其他参数呢?

<template>
  <el-switch v-model="value" @change="changeOpen(param)"> </el-switch>
</template>

<script>
export default {
  data() {
    return {
      value: true,
      param: '父组件参数'
    }
  },
  methods: {
    changeOpen(val) {
      console.log(val)
    }
  }
};
</script>

在这里插入图片描述

或者:

changeOpen(val, val2) {
  console.log(val)
  console.log(val2)
}

在这里插入图片描述

结果发现,@change="changeOpen(param)" 这种方式,参数 param 会覆盖子组件 $emit 传递的新状态的值。解决方案:

  1. $event
  2. 箭头方法:(形参1,形参2, …) => 方法名(实参1,实参2, …)

3.1 $event

$event 是 Vue 中一个特殊的对象,用于在组件之间传递事件信息。它包含有关触发事件的信息,例如:

  • target:触发事件的元素
  • type:事件的类型(例如,“click”、“input”)
  • preventDefault():阻止默认浏览器行为(例如,提交表单)
<template>
  <el-switch v-model="value" @change="changeOpen($event, param)"> </el-switch>
</template>

<script>
export default {
  data() {
    return {
      value: true,
      param: '父组件参数'
    }
  },
  methods: {
    changeOpen(val, val2) {
      console.log(val)
      console.log(val2)
    }
  }
};
</script>

在这里插入图片描述

3.2 箭头方法

<template>
  <el-switch v-model="value" @change="(transParam, localParam) => changeOpen(transParam, param)"> </el-switch>
</template>

在这里插入图片描述

@change="(transParam, localParam) => changeOpen(transParam, param)"transParam 代表子组件传递的参数,localParam 代表父组件自身传参,而且,父组件自身传参一定要放在子组件传递参数的后面

⚠️注1:箭头方法中形参列表可以不声明本地参数。

<template>
  <el-switch v-model="value" @change="(transParam) => changeOpen(transParam, param)"> </el-switch>
</template>

上述写法也可以,形参 localParam 并不是必须的。


4. 子组件传递多个参数,父组件传递本地参数

如果子组件传递多个参数,父组件也需要传递本地参数,怎么操作?

4.1 箭头函数 + … 扩展运算符

箭头函数 + … 扩展运算符

<!-- 子组件 Child.vue -->
<button @click="sendData">发送多个参数</button>

<script>
export default {
  methods: {
    sendData() {
      this.$emit('multi-data', '张三', 25, { city: '北京' });
    }
  }
}
</script>

<!-- 父组件 Parent.vue -->
<Child @multi-data="(...event) => handleMultiData(event, param)" />

<script>
export default {
  components: {Child},
  data() {
    return {
      param: '父组件参数'
    }
  },
  methods: {
    handleMultiData(event, customParam) {
      console.log("event[0]=", event[0])
      console.log("event[1]=", event[1])
      console.log("event[2]=", event[2])
      console.log("customParam=", customParam)
    }
  }
}
</script>

在这里插入图片描述

4.2 箭头方法

<!-- 子组件 Child.vue -->
<button @click="sendData">发送多个参数</button>

<script>
export default {
  methods: {
    sendData() {
      this.$emit('multi-data', '张三', 25, { city: '北京' });
    }
  }
}
</script>

<!-- 父组件 Parent.vue -->
<Child @multi-data="(transParam1, transParam2, transParam3, localParam) => handleMultiData(transParam1, transParam2, transParam3, param)" />

<script>
export default {
  components: {Child},
  data() {
    return {
      param: '父组件参数'
    }
  },
  methods: {
    handleMultiData(val1, val2, val3, val4) {
      console.log("val1=", val1)
      console.log("val2=", val2)
      console.log("val3=", val3)
      console.log("val4=", val4)
    }
  }
}
</script>

在这里插入图片描述

⚠️注1:箭头方法中形参列表可以不声明本地参数。

<Child @multi-data="(transParam1, transParam2, transParam3) => handleMultiData(transParam1, transParam2, transParam3, param)" />

5. 应用

使用其他组件时,回调方法需要传递本地参数时。

示例:点击组件 el-switch 按钮,触发自定义方法,并传递本地参数。

<el-table :data="tableData" stripe :header-cell-style="{ backgroundColor: 'aliceblue', color: '#666' }">
  ...
  <el-table-column label="是否公开">
    <template v-slot="scope">
      <el-switch v-model="scope.row.open" @change="(p1) => changeOpen(p1, scope.row)"></el-switch>
    </template>
  </el-table-column>
</el-table>

<script>
export default {
  data() {
    return {
      form: ''
    }
  },
  methods: {
    changeOpen(p1, row) {
      // 调用更新的接口  更新数据到数据库
      console.log(p1)
      console.log(row)
      this.form = JSON.parse(JSON.stringify(row))
      this.sendSaveRequest()   // 直接发请求就可以了
    }
  }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS基础靶场练习

目录 1. 准备靶场 2. PASS 1. Level 1&#xff1a;无过滤 源码&#xff1a; 2. level2&#xff1a;转HTML实体 htmlspecialchars简介&#xff1a; 源码 PASS 3. level3:转HTML深入 源码&#xff1a; PASS 4. level4:过滤<> 源码&#xff1a; PASS: 5. level5:过滤on 源码…

Redis核心机制(一)

目录 Redis的特性 1.速度快 2.以键值对方式进行存储 3.丰富的功能 4.客户端语言多 5.持久化 6.主从复制 7.高可用和分布式 Redis使用场景 Redis核心机制——持久化 RDB bgsave执行流程 ​编辑 AOF AOF重写流程 3.混合持久化&#xff08;RDBAOF&#xff09; Red…

QGroupBox取消勾选时不禁用子控件

默认情况下&#xff0c;QGroupBox取消勾选会自动禁用子控件&#xff0c;如下图所示 那么如何实现取消勾选时不禁用子控件呢&#xff1f; 实现很简单&#xff0c;直接上代码了 connect(ui->groupBox, &QGroupBox::toggled, this, [](bool checked){if (checked false){…

MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!

目录 一、什么是 MyBatis-Plus 自动填充&#xff1f; &#x1f914;二、自动填充的原理 ⚙️三、实际例子&#xff1a;创建时间和更新时间字段自动填充 ⏰四、注意事项 ⚠️五、总结 &#x1f389; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢…

canvas数据标注功能简单实现:矩形、圆形

背景说明 基于UI同学的设计&#xff0c;在市面上找不到刚刚好的数据标注工具&#xff0c;遂决定自行开发。目前需求是实现图片的矩形、圆形标注&#xff0c;并获取标注的坐标信息&#xff0c;使用canvas可以比较方便的实现该功能。 主要功能 选中图形&#xff0c;进行拖动 使…

【UI设计】一些好用的免费图标素材网站

阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一&#xff0c;拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等&#xff0c;适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…

ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”

问题如题所示&#xff0c;我挂载一个squanfs文件系统到指定目录&#xff0c;当我使用完后&#xff0c;准备解挂载时&#xff0c;提示umount: /home/xx/Applications/yy: target is busy.&#xff0c;具体的如图所示&#xff0c; 这种提示通常是表明这个路径的内容正在被某些进…

一条不太简单的TEX学习之路

目录 rule raisebox \includegraphics newenviro 、\vspace \stretch \setlength 解释&#xff1a; 总结&#xff1a; 、\linespread newcommand \par 小四 \small simple 、mutiput画网格 解释&#xff1a; 图案解释&#xff1a; xetex pdelatex etc index 报…

Matplotlib完全指南:数据可视化从入门到实战

目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图&#xff08;Line Plot&#xff09; 2.2 柱状图&#xff08;Bar Chart&#xff09; 三、高级图表类型 3.1 散点图&#xff08;Scatter Plot&#xff…

在大数据开发中ETL是指什么?

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代&#xff0c;数据已成为企业最核心的资产。然而&#xff0c;分散在业务系统、日志文件…

OAuth 2.0认证

文章目录 1. 引言1.1 系列文章说明1.2 OAuth 2.0 的起源与演变1.3 应用场景概览 2. OAuth 2.0 核心概念2.1 角色划分2.2 核心术语解析 3. 四种授权模式详解3.1 授权码模式&#xff08;Authorization Code Grant&#xff09;3.1.1 完整流程解析3.1.2 PKCE 扩展&#xff08;防止授…

Kubernetes的Replica Set和ReplicaController有什么区别

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源&#xff0c;它们有类似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别&#xff1a; 1. 功能的演进 ReplicationController 是 Kubernete…

[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝

目录 1.计算布尔二叉树的值 题解 2.求根节点到叶节点数字之和 3. 二叉树剪枝 题解 1.计算布尔二叉树的值 链接&#xff1a;2331. 计算布尔二叉树的值 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其…

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题&#xff0c;是一个二维dp的问题&#xff0c;转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…

可视化动态表单动态表单界的天花板--Formily(阿里开源)

文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态&#xff1a; 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…

Amdahl 定律

Amdahl 定律是用来表示&#xff0c;当提高系统某部分性能时对整个系统的影响&#xff0c;其公式如下&#xff1a; a表示我们提升部分初始耗时比例&#xff0c;k是我们的提升倍率&#xff0c;通过这个公式我们可以轻松的得知对每一部分的提醒&#xff0c;对整个系统带来的影响…

Linux系统之美:环境变量的概念以及基本操作

本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令&#xff08;我们的exe&#xff09; 我们以往的Linux编程经验告诉我们&#xff0c;我们在对一段代码编译形成可执行文件后…

pnpm 报错 Error: Cannot find matching keyid 解决

1. 查看corepack版本&#xff0c;升级至0.31.0 npm i -g corepack0.31.0 这里注意环境变量&#xff0c;可能升级后还是指向旧版本&#xff0c;可以选择更新环境变量或者删除原指向的corepack命令 2. 更新pnpm corepack install -g pnpmlatest 问题解决。

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…

Fiddler抓包工具最快入门

目录 前言 了解HTTP网络知识 简单了解网络访问过程 简单了解HTTP网络传输协议 工作过程 HTTP请求&#xff1a; Fildder工具使用教程 抓包的概念 一、什么是抓包 二、为什么要抓包 三、抓包的原理&#xff08;图解&#xff09; Fiddler工具 安装 使用 Fiddler查看…