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让子组件调用父组件中的方法来修改父组件中的值,同时子组件中的值也会发生响应式变化;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chatgpt如何共享可以防止封号!

ChatGPT 是一个基于 GPT-3.5/GPT-4 模型的对话系统&#xff0c;它主要用于处理自然语言对话。通过训练模型来模拟人类的语言行为&#xff0c;ChatGPT 可以通过文本交流与用户互动。每个新版本的 GPT 通常都会在模型规模、性能和其他方面有一些改进。在目前免费版GPT-3.5 中&…

【Vulnhub 靶场】【Corrosion: 1】【简单】【20210731】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/corrosion-1,730/ 靶场下载&#xff1a;https://download.vulnhub.com/corrosion/Corrosion.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年07月31日 文件大小&#xff1a;7.8 GB 靶场作者&#xf…

mysql自增序列 关于mysql线程安全 独享内存 溢出 分析

1 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0c;锁冲突也是影响数据库并发访问性能的一个重要因素。 相对其他数据库而言&#xff0c;MySQL的锁机制比较简单&#xff0c…

关于Triple DES(3DES)对称加密算法

一、引言 在网络安全领域&#xff0c;对称加密算法作为一种常见的加密手段&#xff0c;被广泛应用于保障数据传输的保密性和完整性。其中&#xff0c;DES&#xff08;Data Encryption Standard&#xff09;算法作为一种经典的对称加密算法&#xff0c;由IBM于1970年代开发&…

「数据结构」二叉树2

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;初阶数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#x1f349;链式结构&#x1f349;遍历二叉树&#x1f34c;前序遍历&#x1f34c;中序遍历&#x…

PromptNER: Prompt Locating and Typing for Named Entity Recognition

原文链接&#xff1a; https://aclanthology.org/2023.acl-long.698.pdf ACL 2023 介绍 问题 目前将prompt方法应用在ner中主要有两种方法&#xff1a;对枚举的span类型进行预测&#xff0c;或者通过构建特殊的prompt来对实体进行定位。但作者认为这些方法存在以下问题&#xf…

Python入门学习篇(五)——列表字典

1 列表 1.1 定义 ①有序可重复的元素集合 ②可以存放不同类型的数据 ③个人理解:类似于java中的数组1.2 相关方法 1.2.1 获取列表长度 a 语法 len(列表名)b 示例代码 list2 [1, 2, "hello", 4] print(len(list2))c 运行结果 1.2.2 获取列表值 a 语法 列表名…

渗透实验 XSS和SQL注入(Lab3.0)

windows server2003IIS搭建 配置2003的虚拟机 1、利用AWVS扫描留言簿网站&#xff08;安装见参考文档0.AWVS安装与使用.docx&#xff09;&#xff0c;发现其存在XSS漏洞&#xff0c;截图。 2、 Kali使用beef生成恶意代码 cd /usr/share/beef-xss./beef执行上面两条命令 …

echarts显示N条折线图DEMO

1、代码 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Echarts折线图</title> </head> <body> <div id"main" style"width: 600px;height:400px;"></div> <sc…

Qt/C++视频监控Onvif工具/组播搜索/显示监控画面/图片参数调节/OSD管理/祖传原创

一、前言 能够写出简单易用而又不失功能强大的组件&#xff0c;一直是我的追求&#xff0c;简单主要体现在易用性&#xff0c;不能搞一些繁琐的流程和一些极难使用的API接口&#xff0c;或者一些看不懂的很难以理解的函数名称&#xff0c;一定是要越简单越好。功能强大主要体现…

在做题中学习(39):盛最多水的容器

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 解释&#xff1a;因为木桶原理&#xff0c;能否盛最多的水是由最短的一块板决定的&#xff0c;所以容纳水的公式为&#xff1a;v 两个数下标之差 * 短板高度。 思路&#xff1a;最优解法&#xff08;双指针法&…

房顶漏水啦【算法赛】

问题描述 小蓝家的房顶是一个边长为 n 的正方形&#xff0c;可以看成是由 nn 个边长为 1 的小正方形格子组成。 从上到下第 i 行、从左到右第 j 列的格子用 (i,j) 表示。 小蓝的家由于年久失修&#xff0c;导致房顶有一些地方漏水。总共有 m 处漏水的地方&#xff0c;我们用…

java之Druid连接池介绍和使用方法 简单易懂

文章目录 一、什么是数据库连接池&#xff1f;二、 为什么选择Druid连接池&#xff1f;三、连接池的jar包四、连接池的使用1、配置及使用配置文件连接mysql数据库2、使用Map集合使用Druid 五、总结 一、什么是数据库连接池&#xff1f; 数据库连接池是一个存储数据库连接的缓冲…

银河麒麟v10 rpm安装包 安装mysql 8.35

银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突&#xff0c;因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…

红队打靶练习:DIGITALWORLD.LOCAL: MERCY V2

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 6、总结 目录探测 1、gobuster 2、dirsearch WEB enum4linux枚举工具 smbclient工具 knock工具 CMS 文件包含漏洞 Tomcat 提权 系统信息收集 本地提权 get root 信息收集 1、arp ┌──…

天文与计算机:技术的星辰大海

天文与计算机&#xff1a;技术的星辰大海 一、引言 在人类的历史长河中&#xff0c;天文学与计算机技术这两个领域似乎相隔甚远&#xff0c;然而在科技的推动下&#xff0c;它们却逐渐走到了一起&#xff0c;为人类对宇宙的探索开辟了新的道路。天文观测的复杂度与数据量随着…

C++面向对象(OOP)编程-STL详解(vector)

本文主要介绍STL六大组件&#xff0c;并主要介绍一些容器的使用。 目录 1 泛型编程 2 CSTL 3 STL 六大组件 4 容器 4.1 顺序性容器 4.1.1 顺序性容器的使用场景 4.2 关联式容器 4.2.1 关联式容器的使用场景 4.3 容器适配器 4.3.1 容器适配器的使用场景 5 具体容器的…

Java经典框架之Spring

Java经典框架之Spring Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring简介 2.…

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞 2023/12/20 17:19 简略步骤&#xff1a;rootrootrootroot-X99-Turbo:~/3TB$ tar --use-compress-programpigz -xvpf rk3399-android-10.git-20210201.tgz rootrootro…

HarmonyOS4.0系统性深入开发02 UIAbility组件详解(上)

UIAbility组件概述 概述 UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。 UIAbility组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口&#xff1b;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例…