Vue3中使用props和emits详解

前言

在Vue3中,父子组件之间的数据传递是一个常见的需求。本文将介绍如何在Vue3中传递对象,并且在子组件中访问和修改父组件对象中的属性值,以及子组件如何调用父组件中的方法。


在 Vue 3 中,父子组件之间传值有以下作用:

1. 组件通信:父组件可以通过向子组件传递数据来实现与子组件的通信。这样,父组件就能将数据传递给子组件,并且子组件可以根据接收到的数据进行渲染或执行相应的操作。

2. 数据共享:通过父子组件传值,可以在多个组件之间共享数据。当多个子组件需要访问同一个数据时,可以将数据定义在父组件中,然后通过 props 将数据传递给子组件,从而实现数据共享。

3. 动态配置:父组件可以通过向子组件传递不同的参数或配置,来动态控制子组件的行为。例如,父组件可以根据用户的操作或业务需求,向子组件传递不同的 props 值,以便子组件根据不同的配置进行展示或处理。

4. 构建组件库:通过父子组件传值,可以构建可复用的组件库。父组件可以定义一些可配置的选项或属性,并将它们作为 props 传递给子组件。这样,其他开发者在使用该组件库时,可以根据自己的需求和场景,通过修改 props 值来自定义组件的行为和外观。
 

1. 在setup()语法糖中使用 props 和 emits

setup有props和cxt两个参数,可以在setup语法糖内部使用props 和 emits

父组件代码示例:

<script setup lang="ts">
import {ref} from 'vue'const count = ref(10)
const userlist = ref([{"name":"xujingliang","password":"123456"},{"name":"xujingliang","password":"123456"},{"name":"xujingliang","password":"123456"}
])function edit(val):void{userlist.value[val].name = 'liudehua'
}function del():void{alert("delete")
}
</script><template><definePropsTest :userlist="userlist" :count="count" @edit="edit" @delete="del"></definePropsTest>
</template><style scoped></style>

子组件代码示例: 

<script lang="ts">
import {setup,emit} from 'vue';export default{props:{count:Number,userlist:Array},emits:["edit","delete"],setup(props,cxt){// 语法糖内部使用function edit(index):void{cxt.emit("edit",index)}function del():void{cxt.emit("delete");}return {props,edit,del}},created(){console.log(this.count);console.log(this.userlist)this.$emit("edit",1);}}
</script>
<template>
<!-- 在模版中访问 -->
<p>总共{{ count }}条数据</p><table :border="1"><tr><th>姓名</th><th>密码</th><th>操作</th></tr><tr v-for="(item,index) in userlist" :key="index"><td>{{ item.name }}</td><td>{{ item.password }}</td><td><button @click="edit(index)">编辑</button><button @click="del()">删除</button></td></tr></table></template>

2. <script setup>语法中使用 props和emits

defineProps返回的props对象,是一个proxy对象,所有特性和reactive基本相同,只不过由defineProps定义出的props对象的值是只读的,还有在模板上可以单独属性直接使用

defineProps:父组件传值给子组件,实现子组件访问父组件传入的值

语法:

let props = defineProps({count:Number,       // 也可以直接简写 只填类型userlist:{type:Array,    // 规定数据的类型required:true, // 是否是必填选项default:[]     // 如果父组件没有传值情况下的默认值}
})

父组件

<script setup lang="ts">
import {ref} from 'vue'import definePropsTest from './components/definePropsTest.vue'const count = ref(10)
const userlist = ref([{"name":"xujingliang","password":"123456"},{"name":"xujingliang","password":"123456"},{"name":"xujingliang","password":"123456"}
])</script><template><definePropsTest :userlist="userlist" :count="count"></definePropsTest>
</template><style scoped></style>

子组件

<script setup lang="ts">let props = defineProps({count:Number,       // 也可以直接简写 只填类型userlist:{type:Array,    // 规定数据的类型required:true, // 是否是必填选项default:[]     // 如果父组件没有传值情况下的默认值}})// 在代码中访问console.log(props.count);console.log(props.userlist);</script>
<template>
<!-- 在模版中访问 --><p>总共{{ props.count }}条数据</p><table :border="1"><tr><th>姓名</th><th>密码</th></tr><tr v-for="(item,index) in props.userlist" :key="index"><td>{{ item.name }}</td><td>{{ item.password }}</td></tr></table>
</template>

子组件如何修改父组件传入的值?

vue是单项数据流,引用Vue的官网的话:父系 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父及组件的状态,从而导致你的应用的数据流向难以理解。

在父子组件通讯的时候,子组件都禁止直接修改父级传过来的prop 直接修改在控制台会报错。但VUE的两个语法糖能做到这一点,
 

这里我们来讲defineEmits的使用,子组件调用父组件中的方法

 父组件代码示例:

<script setup lang="ts">
import {ref} from 'vue'const count = ref(10)
const userlist = ref([{"name":"xujingliang","password":"123456"},{"name":"xujingliang","password":"123456"},{"name":"xujingliang","password":"123456"}
])function edit(val):void{userlist.value[val].name = 'liudehua'
}function del():void{alert("delete")
}
</script><template><definePropsTest :userlist="userlist" :count="count" @edit="edit" @delete="del"></definePropsTest>
</template><style scoped></style>

子组件代码示例:

<script setup lang="ts">
let props = defineProps({count:Number,       // 也可以直接简写 只填类型userlist:{type:Array,    // 规定数据的类型required:true, // 是否是必填选项default:[]     // 如果父组件没有传值情况下的默认值}
})const emit = defineEmits(['edit', 'delete']);// 在代码中访问console.log(props.count);console.log(props.userlist);</script>
<template>
<!-- 在模版中访问 --><p>总共{{ props.count }}条数据</p><table :border="1"><tr><th>姓名</th><th>密码</th><th>操作</th></tr><tr v-for="(item,index) in props.userlist" :key="index"><td>{{ item.name }}</td><td>{{ item.password }}</td><td><button @click="emit('edit',index)">编辑</button><button @click="emit('delete',item.name)">删除</button></td></tr></table>
</template>

在Vue3中如果想修改父组件传入的值,只能通过defineEmits让子组件调用父组件中的方法来修改父组件中的值,同时子组件中的值也会发生响应式变化;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用干货:公司规定所有接口都用 POST请求,为什么?

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

可视化开发

可视化开发 数据可视化 交互式可视化 文章目录 可视化开发前言一、可视化开发二、Python数据可视化大屏GIS图像智能识别处理软件开发三、可视化开发必备总结前言 可视化开发可以帮助开发者通过图形化界面和拖放操作来创建、编辑和测试应用程序。使用这些工具,开发者可以提高开…

python爬虫入门,零基础适用

文章目录 什么是爬虫&#xff1f;它能解决什么问题&#xff1f;爬虫的分类&#xff1a;通用网络爬虫&#xff1a;聚焦网络爬虫&#xff1a; 企业获取数据的方式&#xff1a;Python做爬虫的优势&#xff1a;爬虫违法么&#xff1f; http 与 https 协议&#xff1a;什么是协议&am…

如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发

目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架&#xff0c;…

C# Onnx yolov8n csgo player detection

目录 效果 模型信息 项目 代码 下载 C# Onnx yolov8n csgo player detection 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-12-22T15:01:08.014205 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…

Open3D点云处理简明教程

推荐&#xff1a;用NSDT编辑器快速搭建可编程3D场景 这是“激光雷达入门”文章的延续。 在这篇文章中&#xff0c;我们将查看用于处理点云的 python 库和 Open3D 数据结构&#xff0c;执行可视化并操作点云数据&#xff0c;以便进行后续的分析处理。 如果你需要快速预览3D点云…

FMQL开发环境搭建

FMQL开发环境搭建 一、概述 此篇记录上海复旦微电子JFMQL15T开发板开发环境搭建&#xff0c;包含procise安装、vivado2018.3安装破解、IAR安装&#xff0c;以及vivado2018.3 IP_PATCH打补丁全过程&#xff0c;为后续开发基础。 二、IAR安装 安装IAR的软件版本是IAR 8.32.1,…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《redi…

JMeter---JSON提取器

JMeter的JSON提取器是一个用于从JSON响应中提取数据的元件。它可以从JSON响应中提取特定字段的值&#xff0c;并将这些值用于后续的测试步骤。 使用JSON提取器的步骤如下&#xff1a; 添加一个HTTP请求&#xff0c;用于获取包含JSON响应的数据。 在HTTP请求之后添加一个JSON提…

第十一章Java抽象类接口

接口的关键字interface 接口内出现的方法都是抽象方法&#xff0c;接口当中没有属性&#xff0c;接口无创建方法&#xff0c;接口支持向上 抽象内允许 接口的特征 implements后连接的是接口对象

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 基本定时器知识 这节开始学习一下TIM定时器功能&#xff0c;从字面意思上理解&#xff0c;定时器的基本功能就是用来定时&#xff0c;与定时器相结合&#xff0c;可以实现一些周期性的数据发送、采集等功能&#…

linux的主线程提前子线程退出以及线程分离

主线程提前退出 如果主线程没有等待子线程提前退出&#xff0c;可能会发生以下情况&#xff1a; 子线程继续运行&#xff1a;如果主线程退出&#xff0c;但子线程仍在执行任务&#xff0c;子线程将继续独立运行。子线程的生命周期不受主线程控制&#xff0c;直到子线程自行完成…