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

news/2024/11/6 14:28:23 标签: vue.js, 前端, javascript

一、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 有以下两种场景: 

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

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

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

 

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

javascript">// 该 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一个默认值

 


 


http://www.niftyadmin.cn/n/5740971.html

相关文章

使用VBA宏合并多个Excel文件的Sheet页

使用VBA宏合并多个Excel文件的Sheet页 在日常的Excel数据处理工作中&#xff0c;我们经常需要将多个Excel文件中的工作表合并到一个Excel文件中。这种操作可以极大地提高数据处理效率&#xff0c;但如果文件数量较多&#xff0c;手动合并会非常繁琐。本文将介绍如何使用VBA宏来…

iview图片放大缩小旋转预览功能

pc端有图片旋转的需求。单纯用原生的transform旋转&#xff0c;长方形时会溢出父元素。我太菜了&#xff0c;写不来也搜不到怎么避免溢出。终于搜到一个可以直接用的代码。做个备忘&#xff0c;点这里 亲测好使&#xff01;&#xff01;&#xff01;

[论文][环境]3DGS+Colmap环境搭建_WSL2_Ubuntu22.04 - 副本

0. 前言 仅使用Ubuntu进行场景编译&#xff0c;场景渲染查看则使用Windows下官方提供的编译好的预编译包打开即可&#xff0c;非常方便&#xff08;要注意即使是预编译版本&#xff0c;Windows端也应该安装VS和CUDA Toolkit&#xff0c;要注意的是&#xff0c;最新的SIBR预编译…

HTML 标签属性——<a>、<img>、<form>、<input>、<table> 标签属性详解

文章目录 1. `<a>`元素属性hreftargetname2. `<img>`元素属性srcaltwidth 和 height3. `<form>`元素属性actionmethodenctype4. `<input>`元素属性typevaluenamereadonly5. `<table>`元素属性cellpaddingcellspacing小结HTML元素除了可以使用全局…

gdal连接pg(java案例)

1、下载gdal https://www.gisinternals.com/archive.php 打开官方下载地址。 我下载的是3.8.5版本&#xff0c;MSVC2022&#xff0c;x64&#xff0c;release-1930-x64-gdal-3-8-5-mapserver-8-0-1&#xff0c;区别不大&#xff0c;自身系统比较低的下载低版本。 进入3.8.5的下…

【Linux】网络相关的命令

目录 ① ip addr show ② ip route show ③ iptables -nvL ④ ping -I enx00e04c6666c0 192.168.1.100 ⑤ ip route get 192.168.1.100 ⑥ sudo ip addr add dev enx00e04c6666c0 192.168.1.101/24 ⑦ ifconfig ⑧ netstat ⑨ traceroute ⑩ nslookup ① ip addr sho…

华为 HarmonyOS NEXT 原生应用开发: Video实现在线离线视频播放、以及实现控制器控制视频操作。

文章目录 视频播放一、基础使用&#xff08;在线、离线&#xff09;代码示例&#xff1a; 二、自定义video 视频播放代码示例&#xff1a; 视频播放 一、基础使用&#xff08;在线、离线&#xff09; 代码示例&#xff1a; /*** 视频演示*/ Entry Component struct PayIndex …

FPGA跨时钟域处理方法

跨时钟域处理(Cross-Clock Domain Crossing, CDC)是FPGA和数字电路设计中的一个常见问题。它主要是指在不同频率或不同相位的时钟域之间传输数据时所面临的挑战。由于时钟之间的不同,数据可能会在时钟边缘上被读取,从而可能导致亚稳态(Metastability)或数据丢失。 跨时钟…