Vue 组件传递数据-Props(六)

一、Props传递静态数据

defineProps() 和 defineEmits()

       为了在声明 props 和 emits 选项时获得完整的类型推导支持,我们可以使用 defineProps 和 defineEmits API,它们将自动地在 <script setup> 中可用:

  • defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏。他们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉。

  • defineProps 接收与 props 选项相同的值defineEmits 接收与 emits 选项相同的值。

  • defineProps 和 defineEmits 在选项传入后,会提供恰当的类型推导。

 SupComponent.vue 

<template>
	<div>
		<h1>子组件</h1>
		{{username}} ,{{address}}
	</div>
</template>

<script setup>
	defineProps(['username',"address"])
</script>

<style>
</style>

MyParentComponent.vue

<template>
	<div>
		 <p></p>
		 <SubComponent username="张飞飞" address="北京市"></SubComponent>
		
	</div>
</template>

<script setup>
	
	// 引入组件
	import SubComponent from './SubComponent.vue';

	
</script>

 

 二、Props传递动态数据

注意:Props传递动态数据时,我们需要借助v-bind指令或缩写 : 来进行动态绑定的 props:这里我们采用的是其简写形式。

		 <SubComponent :username="msg" :address="addr"></SubComponent>
		
	</div>
</template>

<script setup>
	import {ref} from 'vue'
	// 引入组件
	import SubComponent from './SubComponent.vue';

    const msg=ref('米克')
	const addr=ref('杭州市')
	
</script>

 

  除了使用字符串,还可以使用一个对象绑定多个 prop

三、单向数据流 

      所有的 props 都遵循着单向绑定原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递。这避免了子组件意外修改父组件的状态的情况,不然应用的数据流将很容易变得混乱而难以理解。

      另外,每次父组件更新后,所有的子组件中的 props 都会被更新到最新值,这意味着你不应该在子组件中去更改一个 prop。若你这么做了,Vue 会在控制台上向你抛出警告

  如果需要更改 prop 有以下两种场景: 

<script setup>
	import {ref,computed} from 'vue'
	const props=defineProps({
		count:{
			type:Number,
			default: 1    // Number 类型的默认值
		},
		size:{
			type:String,
			default: 'book'    //默认值
		}})

1、prop 被用于传入初始值;而子组件想在之后将其作为一个局部数据属性

// 只是将 props.count 作为初始值
	// 像下面这样做就使 prop 和后续更新无关了
	const mycount=ref(props.count)

 

2、需要对传入的 prop 值做进一步的转换。在这种情况中,最好是基于该 prop 值定义一个计算属性: 

// 该 prop 变更时计算属性也会自动更新
	const mySize = computed(() => props.size.trim().toUpperCase())

 

 

 四、props校验

props主要目的:为组件的 prop 指定验证要求,不符合要求,控制台就会有错误提示 → 帮助开发者,快速发现错误

props语法

props: {
    校验的属性名:类型 // Stirng | Number | Object | Array | Boolean | Function
    list:Array, // 表示只校验类型,类型是数组即可
   say:Function, // 表示只校验类型,类型是函数即可
}
  • 类型校验
  • 非空校验
  • 默认值
  • 自定义校验
props: {
  校验的属性名: {
    type: 类型,  // Number String Boolean ...
    required: true, // 是否必填
    default: 默认值, // 默认值
    validator (value) {
      // 自定义校验逻辑
      return 是否通过校验
    }
  }
},

 子组件Children.vue

<template>
	<div>
		{{username}}  {{age}} {{flag}} <br/><br/>
		{{hobby}} <br/><br/>
		{{emp}}  <br/><br/>
	</div>
</template>

// 注意:必须使用setup,否则不能渲染
<script setup>
import {ref,computed} from 'vue'
const props=defineProps({
	username:{
		type:String,
		required: true    //父组件,必须传递值
	},
	age:{
		type:[Number,String], // 传递过来的数据,可以是数字或字符串
		default: 18    //如果父组件不传,则默认值
	},
	flag:{
		type:Boolean
	},
	hobby:Array, // 表示只校验类型,类型是数组即可
	emp:{
		default:()=>{
			return{} // 对于默认值是数组或对象的情况,默认值要写一个函数,函数中返回默认值
		}
	},
	show:Function // 表示只校验类型,类型是函数即可 
	})
</script>

<style>
</style>

父组件Mother.vue

<template>
	<div>
		<p></p>
		<Children username="mike"
		:age="re.age"
		:flag="re.flag"
		:hobby="re.hobby"
		:emp="re.emp"
		:show="re.show"
		></Children>
	</div>
</template>

<script setup>
	import Children from "./Children.vue"
	import {ref,reactive} from 'vue'
	
	//父传子的类型数据
	const re = reactive({  
	  age:20,  
	  flag: true,  
	  hobby: ['play','sleep','read'],
	  emp:{name:'john',gender:'man'},
	  show(){
		  console.log('I am props!')
	  }
	  })
</script>

 

 注意:

1.default和required一般不同时写(因为当时必填项时,肯定是有值的)

2.default后面如果是简单类型的值,可以直接写默认。如果是复杂类型的值,则需要以函数的形式return一个默认值

 


 

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

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

相关文章

SpringBoot源码解析(三)

一、手写模拟springboot核心流程 前面两章内容已经详细解释了springboot的核心原理与启动流程&#xff0c;本章通过手写模拟实现一个SpringBoot&#xff0c;让大家能以非常简单的方式就能知道SpringBoot大概是如何工作的&#xff0c;作为对上两章内容的一个巩固。 一、模拟Sp…

Python实战:调用淘宝API以抓取商品页面数据

在数据驱动的商业决策中&#xff0c;获取电商平台的商品数据至关重要。淘宝作为中国最大的在线购物平台&#xff0c;其商品数据对于市场分析、价格监控和竞品研究等方面都具有极高的价值。本文将通过一个Python实战案例&#xff0c;展示如何调用淘宝API来抓取商品页面的数据。 …

STL---迭代器

本文来源&#xff1a;《C语言程序设计》第10章 理解迭代器对于理解STL框架并掌握STL的使用至关重要。 迭代器是泛化的指针&#xff0c;STL算法利用迭代器对存储在容器中的元素序列进行遍历&#xff0c;迭代器提供了访问容器中每个元素的方法。 虽然指针也是一种迭代器&#…

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责&#xff1a;每个类应该有一个明确的职责&#xff0c;避免将多个责任混合在一起。降低耦合&#xff1a;通过将不同的职责分开&#xff0c;可以降低类之间的耦合度&#xff0c;提高系统的灵活性。易于维护&#xff1a;当…

京东AI单旋旋转验证码98准确率通杀方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文滑块识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/12 京东单旋验证码最近更新了,使用AI生成,要求识别角度,以下是部分数据集: 接下…

playground.tensorflow神经网络可视化工具

playground.tensorflow 是一个可视化工具&#xff0c;用于帮助用户理解深度学习和神经网络的基本原理。它通过交互式界面使用户能够构建、训练和可视化简单的神经网络模型。以下是一些主要的数学模型和公式原理&#xff0c;它们在这个平台中被应用&#xff1a; 1. 线性模型 线…

[vulnhub] DarkHole: 2

https://www.vulnhub.com/entry/darkhole-2,740/ 端口扫描主机发现 探测存活主机&#xff0c;185是靶机 # nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 18:02 CST Nmap scan report for 192.168.75.1 Host is up (0.…

【开源免费】基于SpringBoot+Vue.JS宠物咖啡馆平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 064 &#xff0c;文末自助获取源码 \color{red}{T064&#xff0c;文末自助获取源码} T064&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

移动取证和 Android 安全

当今的数字时代已经产生了许多技术进步&#xff0c;无论是智能手机还是虚拟现实、人工智能和物联网 (IoT) 等下一代基础技术。 智能手机已不再只是奢侈品&#xff0c;而是我们生存所必需的东西。根据各种统计数据&#xff0c;如今全球有超过 50% 的人使用手机。 由于数据存储…

C++builder中的人工智能(14):修正线性单元(ReLU)激活函数

这篇文章将解释在人工神经网络&#xff08;ANN&#xff09;中修正线性函数&#xff08; Rectified Linear Function&#xff09;是什么&#xff0c;以及如何使用ReLU激活函数。让我们回顾一下激活函数的概念&#xff0c;并定义这些术语。学习修正线性函数对于使用C软件编写程序…

【信号处理】基于联合图像表示的深度学习卷积神经网络

Combined Signal Representations for Modulation Classification Using Deep Learning: Ambiguity Function, Constellation Diagram, and Eye Diagram 信号表示 Ambiguity Function(AF) 模糊函数描述了信号的两个维度(dimensions):延迟(delay)和多普勒(Doppler)。 …

05 SQL炼金术:深入探索与实战优化

文章目录 SQL炼金术&#xff1a;深入探索与实战优化一、SQL解析与执行计划1.1 获取执行计划1.2 解读执行计划 二、统计信息与执行上下文2.1 收集统计信息2.2 执行上下文 三、SQL优化工具与实战3.1 SQL Profile3.2 Hint3.3 Plan Baselines3.4 实战优化示例 SQL炼金术&#xff1a…

MySQL_第13章_视图

1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图&#xff1f; 视图一方面可以使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。 2.2 视图的理解 视图是一种虚拟表&#xff0c;本身是不具有数据的&#xff0c;占用很少的内存…

【代码随想录day24】【C++复健】93.复原IP地址; 78.子集 ;90.子集II

今天写代码的时候整体状态其实就不太好&#xff0c;整个人晕晕的&#xff0c;好多时候写出来的代码也是多少带点愚蠢。 93.复原IP地址 看卡哥说“大家做完 分割回文串 之后&#xff0c;本题就容易很多了”还以为是秒杀题呢&#xff0c;结果直接被卡住。怎么说呢&#xff0c;…

Vue:条件渲染 列表渲染

Vue&#xff1a;条件渲染 & 列表渲染 条件渲染v-showv-if 列表渲染v-for数组对象 条件渲染 Vue允许依据一定的条件&#xff0c;通过表达式的布尔值&#xff0c;来决定是否渲染某些元素&#xff0c;其依赖于v-show和v-if两条指令。 v-show v-show可以依据表达式的布尔值&…

计算机的错误计算(一百四十八)

摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…

input file检验成功之后才可以点击

input file检验成功之后才可以点击 需求 在上传发票前需要先填写发票号&#xff0c;然后点击选择文件直接完成上传功能 实现思路 在没有输入发票号之前&#xff0c;file按钮不可用不能点击&#xff0c;输入之后&#xff0c;按钮可用&#xff0c;点击之后选择文件&#xff…

理解鸿蒙app 开发中的 context

是什么 Context是应用中对象的上下文&#xff0c;其提供了应用的一些基础信息&#xff0c;例如resourceManager&#xff08;资源管理&#xff09;、applicationInfo&#xff08;当前应用信息&#xff09;、dir&#xff08;应用文件路径&#xff09;、area&#xff08;文件分区…

算法每日练 -- 双指针篇(持续更新中)

介绍&#xff1a; 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff08;左右指针&#xff09;&#xff0c;一种是快慢指针&#xff08;前后指针&#xff09;。需要注意这里的双指针不是 int* 之类的类型指针&#xff0c;而是使用数组下标模拟地址来进行遍历的方式。 …

Python学习从0到1 day26 第三阶段 Spark ①

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义&#xff1a; Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…