vue3父子组件props传值,defineprops怎么用?(组合式)

news2025/2/26 4:49:26

目录

1.基础用法

2.使用解构赋值的方式定义props

3.使用toRefs的方式解构props

(1).通过ref响应式变量,修改对象本身不会触发响应式


1.基础用法

父组件通过在子组件上绑定子组件中定义的props(:props=“”)传递数据给子组件

<!-- 父组件 -->
<template>
  <div>
    <ChildComponent :message="parentMessage" />
  </div>
</template>
 
<script setup>
import { ref } from 'vue';

//导入子组件
import ChildComponent from './ChildComponent.vue';
 
const parentMessage = ref('Hello from Parent');
</script>

在子组件中通过 defineprops 函数在子组件中定义props,在父组件上导入的子组件上绑定子组件定义的 props 就可以接收这些数据,然后可在 template (模板)中直接使用

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

//直接定义一个props(即message)
defineProps({
  message: {
    type: String,
    required: true
  }
});

</script>

但是,如果想要在JS代码中使用父组件传递的props数据时,必须要定义一个变量(一般我们使用props作为变量名)来接收defineprops函数的返回值才能使用

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

//定义props变量接收defineProps返回值
const props = defineProps({
  message: {
    type: String,
    required: true
  }
});

//在JS中使用message的值
console.log(props.message)

</script>

如果不定义一个变量接受,直接获取父组件传过来的数据message是undefinded

2.使用解构赋值的方式定义props

有时候为了方便使用父组件通过props传递过来的值,子组件一般会直接解构拿到父组件传来的值(这里使用message1和message2进行展示)

<!-- 子组件 -->
<template>
  <div>
    <p>{{ message1 }}</p>
  </div>
</template>
 
<script setup>

//解构赋值props
const {message1,message2} = defineProps({
  message1: {
    type: String,
    required: true
  },
  message2: {
    type: String,
    required: true
  }
});

//在JS中直接使用message1,message2的值
console.log(props.message1,props.message2)

</script>

 这样做可以直接使用message1和message2,无需props.message1和props.message2

3.使用toRefs的方式解构props

toRefs可以让一个reactive对象的属性都变为ref对象。
在vue3早期版本时,解构props会造成数据会失去响应式,所以解构时,需要用torefs包裹,因为props本质上时reactive对象,torefs可以把reactive的每个属性变成ref对象,这样解构出来依旧是响应式。
注意:在Vue3的组合式API中, defineProps是一个内置的全局函数,不需要显式引入,而toRefs的使用需要引入。

<!-- 子组件 -->
<template>
  <div>
    <p>{{ message1 }}</p>
  </div>
</template>
 
<script setup>
import {toRefs } from 'vue';
 
const props = defineProps({
  message1: {
    type: String,
    required: true
  },
  message2: {
    type: String,
    required: true
  }
});

//使用toRefs解构props
const {message1,message2} = toRefs(props);

console.log(message1,message2);
</script>

 注意:torefs不能直接包裹 defineprops函数 ,会报错defineprops未定义

(1).通过ref响应式变量,修改对象本身不会触发响应式

还有一个因为响应式原理引发的有趣现象,首先我们定义一个obj对象,然后定义另一个obj1 ref对象包裹obj,例如:

<template>
  {{ obj1 }}
  <button
    @click="
      () => {
        obj.a = 3;
        console.log(obj, obj1);
      }
    "
  >
    点击按钮
  </button>
</template>
<script setup>
import { ref } from "vue";
const obj = { a: 1, b: 2 };
const obj1 = ref(obj);
</script>
<style></style>


此时通过obj更改对象内属性a ,可以看到无论是obj还是obj1都被成功更改,但dom没有响应式更新。

原因就是通过obj更改,并没有调用obj1的set方法,所以没有触发该实例的渲染函数,普通类型的数据也是一样,只要不是通过ref对象本身更改,都不会调用set方法,就不会调用组件实例渲染函数,也就不会响应式(可以去查看响应式的原理)。

所以一般这种情况,需要其他变量定义响应式变量时,可以通过computed函数,即可响应式(ref包裹对象时,本质还是通过reactive包裹,所以一样会深度监听,所以没有响应式的原因就是没有调用set方法,跟ref能否深度监听无关)

torefs包裹reactive对象会使其每个属性值变成ref对象,单独具有响应式,所以结构出来不会失去响应式,但此ref对象和普通的ref对象不同,有两个普通ref对象没有的key属性和object属性,其中key属性是解构出来的属性的属性名,object是原reactive对象,当我们获取value值时,ref的get属性并不会直接返回value,而是通过key值向object属性值,也就是原reactive对象上获取,同样的,set方法也是更改原reactive对象,所以即使解构出来,单独使用,也会和原对象的值保持一致

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

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

相关文章

Django-Vue 学习-VUE

主组件中有多个Vue组件 是指在Vue.js框架中&#xff0c;主组件是一个父组件&#xff0c;它包含了多个子组件&#xff08;Vue组件&#xff09;。这种组件嵌套的方式可以用于构建复杂的前端应用程序&#xff0c;通过拆分功能和视图&#xff0c;使代码更加模块化、可复用和易于维…

Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B

文章目录 一、下模二、转模1. 下载转换工具2. 安装环境依赖3. llama.cpp1. 转换脚本依赖2. llama.cpp安装依赖包3. llama.cpp编译安装4. 格式转换 三、Ollama部署1. 安装启动Ollama2. 添加模型3. 测试运行 一、下模 #模型下载 from modelscope import snapshot_download model…

Zabbix问题记录2--踩坑HttpRequest,header添加无效

背景 在试图尝试通过Zabbix接入DeepSeek API的时候&#xff0c;由于使用了HTTP的方式&#xff0c;所以需要使用Zabbix 自带的HttpRequest库进行请求&#xff0c;产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…

Redis 集群的三种模式:一主一从、一主多从和多主多从

本文记述了博主在学习 Redis 在大型项目下的使用方式&#xff0c;包括如何设置Redis主从节点&#xff0c;应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后&#xff0c;进而想要了解 Redis 集群如何使用&#xff0c;如何正确使用&#xf…

网络工程知识笔记

1. 什么是网络&#xff1f; 网络是由多个节点&#xff08;如计算机、打印机、路由器等&#xff09;通过物理或逻辑连接组成的系统&#xff0c;用于数据的传输和共享。这些节点可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如 Wi-Fi&#xff09;方式进行连接…

初识.git文件泄露

.git 文件泄露 当在一个空目录执行 git init 时&#xff0c;Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库&#xff0c;只需把这个目录拷贝至另一处就可以了 这是一种常见的安全漏洞&#xff0c;指的是网站的 .git 目录…

政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio&#xff08;UI&#xff09; 运…

(六)趣学设计模式 之 代理模式!

目录 一、啥是代理模式&#xff1f;二、为什么要用代理模式&#xff1f;三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&a…

力扣LeetCode:1656 设计有序流

题目&#xff1a; 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 id 递增的顺序…

鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)

鸿蒙开发深入浅出03&#xff08;封装通用LazyForEach实现懒加载&#xff09; 1、效果展示2、ets/models/BasicDataSource.ets3、ets/models/HomeData.ets4、ets/api/home.ets5、ets/pages/Home.ets6、ets/views/Home/SwiperLayout.ets7、后端代码 1、效果展示 2、ets/models/Ba…

DSP芯片C6678的SRIO及其中断跳转的配置

C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码&#xff0c;部分参考于网友们的博客&#xf…

2025asp.net全栈技术开发学习路线图

2025年技术亮点‌&#xff1a; Blazor已全面支持WebAssembly 2.0标准 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服务实现智能自动扩缩容 EF Core新增向量数据库支持特性 ‌ASP.NET 全栈开发关键技术说明&#xff08;2025年视角&#xff09;‌ 以下技术分类基于现…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…

nodejs npm install、npm run dev运行的坎坷之路

1、前面的种种都不说了&#xff0c;好不容易运行起来oap-portal项目&#xff0c;运行idm-ui项目死活运行不起来&#xff0c;各种报错&#xff0c;各种安装&#xff0c;各种卸载nodejs&#xff0c;卸载nvm&#xff0c;重装&#xff0c;都不好使。 2、甚至后来运行npm install会…

大型装备故障诊断解决方案

大型装备故障诊断解决方案 方案背景 在全球航空工业迅猛发展的背景下&#xff0c;我国在军用和民用飞机自主研发制造领域取得了显著成就。尤其是在国家大力支持下&#xff0c;国内飞机制造企业攻克了诸多关键技术难题&#xff0c;实现了从设计研发到生产制造再到售后保障的完整…

反向代理模块kfj

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

Python Seaborn库使用指南:从入门到精通

1. 引言 Seaborn 是基于 Matplotlib 的高级数据可视化库,专为统计图表设计。它提供了更简洁的 API 和更美观的默认样式,能够轻松生成复杂的统计图表。Seaborn 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Seaborn 的基本概念、常用功能以及高级用法,…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说&#xff0c;APP更新功能再常见不过了&#xff0c;因为平台更新审核时间较长&am…

JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用

生产问题定位指南&#xff1a;几款必备的可视化工具 引言 在上一篇文章中&#xff0c;详细的介绍了JDK自带的一系列命令行工具&#xff0c;&#xff0c;如jps、jmap、jstat、jstack以及jcmd等&#xff0c;这些工具为排查和诊断Java虚拟机&#xff08;JVM&#xff09;问题提供…

力扣3102.最小化曼哈顿距离

力扣3102.最小化曼哈顿距离 题目 题目解析及思路 题目要求返回移除一个点后的最小的最大曼哈顿距离 最大最小值的题一般直接想到二分 本题有一个简单办法就是利用切比雪夫距离 当正方形转45&#xff0c;即边上点**( x , y ) -> (x y , y - x)时&#xff0c;两点间max(…