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

VUE3中子组件改变父组件传过来的值(props)的方法和使用场景详解

在 Vue 3 中,子组件改变父组件传过来的值(props)的方法主要有以下几种:通过事件发射、使用 v-model、模拟 .sync 修饰符的功能(Vue 3 中已移除),以及使用 refreactive。下面我将结合代码示例和使用场景详细讲解这些方法。


1. 通过事件发射

使用场景:当子组件需要显式通知父组件更新 props 的值时,事件发射是一种常见且推荐的方式。这种方法清晰地表达了数据流向,符合 Vue 的单向数据流原则。

代码示例

// 父组件
<template><div><Child :message="parentMessage" @update:message="updateMessage" /><p>父组件值:{{ parentMessage }}</p></div>
</template><script setup>
import { ref } from 'vue';
import Child from './Child.vue';const parentMessage = ref('Hello from parent');const updateMessage = (newMessage) => {parentMessage.value = newMessage;
};
</script>// 子组件
<template><div><input v-model="localMessage" @input="handleInput" /></div>
</template><script setup>
import { ref, watch } from 'vue';const props = defineProps({message: String
});const emit = defineEmits(['update:message']);const localMessage = ref(props.message);// 监听 props 的变化,同步本地值
watch(() => props.message, (newVal) => {localMessage.value = newVal;
});const handleInput = () => {emit('update:message', localMessage.value);
};
</script>

解释

  • 父组件将 parentMessage 作为 prop 传递给子组件,并监听子组件发出的 update:message 事件。
  • 子组件使用 localMessage 维护本地状态,并通过 watch 确保与父组件的 prop 同步。
  • 当输入框的值改变时,子组件通过 emit('update:message') 通知父组件更新 parentMessage

2. 使用 v-model

使用场景:当 prop 需要双向绑定时(例如表单输入),使用 v-model 是一种简洁的方式。它本质上是对事件发射的封装,适合需要频繁更新的场景。

代码示例

// 父组件
<template><div><Child v-model:message="parentMessage" /><p>父组件值:{{ parentMessage }}</p></div>
</template><script setup>
import { ref } from 'vue';
import Child from './Child.vue';const parentMessage = ref('Hello from parent');
</script>// 子组件
<template><div><input v-model="localMessage" /></div>
</template><script setup>
import { computed } from 'vue';const props = defineProps({message: String
});const emit = defineEmits(['update:message']);const localMessage = computed({get() {return props.message;},set(value) {emit('update:message', value);}
});
</script>

解释

  • 父组件使用 v-model:messageparentMessage 绑定到子组件,实际上是监听 update:message 事件并传递 prop。
  • 子组件通过 computed 创建一个计算属性 localMessage,其 getter 返回 prop 值,setter 触发 update:message 事件。
  • 输入框的值改变时,localMessage 的 setter 会被调用,通知父组件更新 parentMessage

3. 模拟 .sync 修饰符的功能

使用场景:在 Vue 2 中,.sync 修饰符用于双向绑定 prop,但在 Vue 3 中被移除。可以通过显式的事件发射实现类似功能,适合需要更新特定 prop 的场景。

代码示例

// 父组件
<template><div><Child :message="parentMessage" @update:message="parentMessage = $event" /><p>父组件值:{{ parentMessage }}</p></div>
</template><script setup>
import { ref } from 'vue';
import Child from './Child.vue';const parentMessage = ref('Hello from parent');
</script>// 子组件
<template><div><button @click="updateMessage">更新消息</button></div>
</template><script setup>
const props = defineProps({message: String
});const emit = defineEmits(['update:message']);const updateMessage = () => {emit('update:message', 'New message from child');
};
</script>

解释

  • 父组件监听 update:message 事件,并直接将事件参数赋值给 parentMessage
  • 子组件在按钮点击时通过 emit 发射 update:message 事件,携带新值。
  • 这种模式与 Vue 2 的 .sync 类似,但需要手动实现。

4. 使用 refreactive

使用场景:当 prop 是一个对象或数组时,可以将它包装在 refreactive 中传递给子组件。子组件可以直接修改这些值,因为它们是响应式的。这种方式适合复杂数据结构的场景,但可能模糊单向数据流的边界。

代码示例

// 父组件
<template><div><Child :data="parentData" /><p>父组件值:{{ parentData.message }}</p></div>
</template><script setup>
import { reactive } from 'vue';
import Child from './Child.vue';const parentData = reactive({ message: 'Hello from parent' });
</script>// 子组件
<template><div><input v-model="data.message" /></div>
</template><script setup>
const props = defineProps({data: Object
});
</script>

解释

  • 父组件使用 reactive 创建一个响应式对象 parentData,并将其作为 prop 传递给子组件。
  • 子组件直接操作 data.message,由于它是响应式对象,修改会自动反映到父组件。
  • 注意:这种方式绕过了显式的事件发射,建议谨慎使用,避免数据流向不清晰。

总结

以下是各种方法的适用场景和特点:

  • 事件发射:最符合 Vue 单向数据流原则,适合需要显式通知父组件的场景。
  • v-model:简洁优雅,适合表单输入等双向绑定场景。
  • 模拟 .sync:Vue 3 中替代 .sync 的手动实现,适合特定 prop 的更新。
  • refreactive:适合传递对象或数组,子组件可以直接修改,但需注意数据流清晰度。

根据具体需求选择合适的方法,确保代码的可维护性和数据流的一致性。

相关文章:

VUE3中子组件改变父组件传过来的值(props)的方法和使用场景详解

在 Vue 3 中&#xff0c;子组件改变父组件传过来的值&#xff08;props&#xff09;的方法主要有以下几种&#xff1a;通过事件发射、使用 v-model、模拟 .sync 修饰符的功能&#xff08;Vue 3 中已移除&#xff09;&#xff0c;以及使用 ref 或 reactive。下面我将结合代码示例…...

登录-06.JWT令牌-生成和校验

一.JWT令牌的生成和校验 JWT令牌生成 想要生成JWT令牌&#xff0c;那么就要首先引入JWT令牌的相关依赖&#xff0c; <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>…...

【Git】多人协作

文章目录 完成准备工作多人协作场景一场景二远程分支删除后&#xff0c;本地 git branch -a 依然能看到的解决办法 完成准备工作 在之前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#…...

Python爬虫-破解字体加密技术

前言 本文是该专栏的第77篇,后面会持续分享python爬虫干货知识,记得关注。 字体加密是一种常见的反爬虫技术,通过自定义字体文件和字符映射来保护网页内容,防止爬虫直接获取文本信息。 在文章《Python爬虫-猫眼电影的影院数据》中,笔者有详细介绍过猫眼的相关数据采集。…...

邮件安全之发件人伪造

电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议&#xff0c;具体功能如下&#xff1a; SMTP:全称Simple Mail Transfer Protocol&#xff0c;即简单邮件传输协议&#xff0c;主要用于发送邮件&#xff0c;使用端口号25。 IMAP:全称Internet Mail Acce…...

git 常用功能

以下是 Git 的常用功能及其命令&#xff1a; 初始化仓库 git init在当前目录初始化一个新的 Git 仓库。 克隆仓库 git clone <仓库地址>将远程仓库克隆到本地。 查看状态 git status查看工作区和暂存区的状态。 添加文件到暂存区 git add <文件名>将文件添…...

【llm落地】从零到一,用DeepSeek打造智能BI工具:自然语言驱动数据洞察

在数据驱动的时代,商业智能 (BI) 工具已经成为企业决策的关键。然而,传统的 BI 工具往往操作复杂,需要专业技能才能驾驭。想象一下,如果用户只需要用 自然语言 就能轻松查询数据、获取分析结果甚至生成可视化图表,那将会多么高效和便捷! 本文将带你踏上从零到一构建智能…...

请谈谈 Vue 中的 key 属性的重要性,如何确保列表项的唯一标识?

1. Key属性的核心作用&#xff08;附代码对比&#xff09; // 错误示例&#xff1a;未使用key的列表渲染 <template><ul><li v-for"item in items">{{ item.text }}</li></ul> </template>// 正确示例&#xff1a;使用唯一key的…...

使用 AIStor 和 OpenSearch 增强搜索功能

在这篇文章中&#xff0c;我们将探讨搜索&#xff0c;特别是 OpenSearch 如何帮助我们识别模式或查看不断增长的数据中的趋势。例如&#xff0c;如果您正在查看运营数据&#xff0c;如果您的服务似乎是随机的&#xff0c;那么您需要尽可能回溯以识别模式并找出原因。这不仅适用…...

Node.js中如何修改全局变量的几种方式

Node.js中如何修改全局变量。我需要先理解他们的需求。可能他们是在开发过程中遇到了需要跨模块共享数据的情况&#xff0c;或者想要配置一些全局可访问的设置。不过&#xff0c;使用全局变量可能存在一些问题&#xff0c;比如命名冲突、难以维护和测试困难&#xff0c;所以我得…...

基于Python和Neo4j开发的医疗辅助诊断系统的详细实现步骤和代码示例

以下是一个基于Python和Neo4j开发的医疗辅助诊断系统的详细实现步骤和代码示例。 1. 环境准备 首先&#xff0c;确保你已经安装了必要的库。可以使用以下命令进行安装&#xff1a; pip install py2neo2. Neo4j数据库初始化 在Neo4j中创建一个新的数据库&#xff0c;并启动N…...

第9章:LangChain结构化输出-示例2(数字提取服务)

如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解&#xff0c;将自然语言处理任务&#xff08;如情感分析、数字提取、日期提取、POJO提取等&#xff09;封装为服务&#xff0c;并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于Lan…...

【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新

note &#xff08;1&#xff09;未来的工作需亟待解决&#xff1a; 支持大规模 RL 训练&#xff08;PPO、GRPO 等&#xff09;的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比&#xff08;难度、领域、任务等&#xff09;基于 Instruct 模型训练 R…...

买股票的最佳时机 - 2

买卖股票的最佳时机 III 题目描述&#xff1a; 提示&#xff1a; 1 < prices.length < 1050 < prices[i] < 105 分析过程&#xff1a; 写动态规划&#xff0c;我们需要考虑一下问题&#xff1a; 定义状态状态转移方程初始条件 遍历顺序 4种状态&#xff1a; …...

Python基于flask的智慧交通可视化,大数据智慧交通数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…...

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting &#xff08;GPU友好&#xff09;version5_Skinning &#xff08;TODO&#xff09; 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…...

Unity使用IL2CPP打包时,我们应该注意什么?如何避免(可以举例说明)

这一篇部分内容在Unity之中如何处理C#底层代码那篇博客之中有提及&#xff0c;接下来对这部分进行补充说明。&#xff08;请先阅读--Unity之中如何处理C#底层代码&#xff09; 目录 1 注意点 2 如何避免 1 注意点 IL2CPP 在编译过程中会将 IL&#xff08;中间语言&#xf…...

Wireshark使用介绍

文章目录 Wireshark介绍Wireshark使用工作模式介绍1. 混杂模式&#xff08;Promiscuous Mode&#xff09;2. 普通模式&#xff08;Normal Mode&#xff09;3. 监视模式&#xff08;Monitor Mode&#xff09; 界面分区捕获过滤器语法基本语法逻辑运算符高级语法使用示例捕获过滤…...

云图库平台(五)——后端图片模块开发

目录 一、需求分析二、库表设计三、图片的处理如何实现图片的上传和下载创建图片的业务流程如何对图片进行解析 四、创建并使用对象存储五、后端操作对象存储初始化客户端通用能力类文档上传文件下载 一、需求分析 管理员功能&#xff1a; 图片的上传和创建&#xff1a;仅管理…...

postman调用ollama的api

按照如下设置&#xff0c;不需要设置key 保持长会话的方法 # 首次请求 curl http://localhost:11434/api/generate -d {"model": "deepseek-r1:32b","prompt": "请永久记住&#xff1a;110&#xff0c;1-12&#xff0c;之后所有数学计算必…...

十、OSG学习笔记-多线程(OpenThreads)

上一节内容&#xff1a; 九、OSG学习笔记-NodeVisitor节点遍历器-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145742756?spm1001.2014.3001.5501 本章节代码&#xff1a; OsgStudy/Openthreads CuiQingCheng/OsgStudy - 码云 - 开源中国https://gite…...

Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析:源代码

Gemma 2 的滑动窗口注意力&#xff08;Sliding Window Attention&#xff09;解析 在 Transformer 结构 中&#xff0c;自注意力&#xff08;Self-Attention&#xff09;是核心机制之一。然而&#xff0c;标准的自注意力计算复杂度为 ( O ( n 2 ) O(n^2) O(n2) )&#xff0c;随…...

机器学习数学通关指南——链式法则

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...

Python爬虫实战:从零到一构建数据采集系统

文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代&#xff0c;数据采…...

DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

【行业解决方案篇十八】【DeepSeek航空航天:故障诊断专家系统 】

引言:为什么说这是“航天故障终结者”? 2025年春节刚过,航天宏图突然官宣"DeepSeek已在天权智能体上线",这个搭载在卫星和空间站上的神秘系统,号称能提前48小时预判99.97%的航天器故障。这不禁让人想起年初NASA禁用DeepSeek引发的轩然大波,更让人好奇:这套系…...

谷歌浏览器更新后导致的刷新数据无法显示

这几天突然出现的问题&#xff0c;就是我做了一个网站&#xff0c;一直用Google展示&#xff0c;前两天突然就是刷新会丢失数据&#xff0c;然后再刷新几次吧又有了&#xff0c;之前一直好好的&#xff0c;后端也做了一些配置添加了CrossOrigin注解&#xff0c;然而换了edge浏览…...

nvidia-docker2 和 NVIDIA Container Toolkit 的区别及推荐

NVIDIA Docker 和 NVIDIA Container Toolkit 1. NVIDIA Docker 和 NVIDIA Docker2 nvidia-docker 是 NVIDIA 最早推出的工具&#xff0c;用于在 Docker 容器中启用 GPU 支持。它以独立守护进程的形式作为 Volume Plugin 存在&#xff0c;但与 Docker 生态系统的兼容性较差&am…...

游戏设计模式阅读 - 游戏循环

游戏与普通程序最大的不同点在于&#xff1a; 游戏不像其他大多数软件&#xff0c;游戏即使在没有玩家输入时也继续运行。 如果你站在那里看着屏幕&#xff0c;游戏也不会冻结。动画会持续播放。视觉效果继续闪烁。 如果运气不好的话&#xff0c;怪物会继续暴揍你的角色。 那么…...

(五)趣学设计模式 之 建造者模式!

目录 一、 啥是建造者模式&#xff1f;二、 为什么要用建造者模式&#xff1f;三、 建造者模式怎么实现&#xff1f;四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方…...