Vue——组件数据传递与props校验

news2024/11/19 18:42:27

文章目录

  • 前言
  • 组件数据传递的几种类型
    • 简单字符串类型数据专递
    • 其他类型数据(数字、数组、对象)传递
    • 注意事项
  • 数据传递值校验
    • 限定数据类型 type
    • 给定默认值 default
    • 指定必选项 required

前言

组件与组件之间并不是完全独立的,他们之间可以进行一些数据的传递操作。传递数据的解决方案就是props选项。

组件数据传递的几种类型

简单字符串类型数据专递

比如定义两个页面Parent.vueChild.vue,其中Parent.vue包含Child.vue

Child.vue

<template>
 <div class="div">
   <h1>子类组件</h1><br>
   <p>msg: {{ msg }}</p><br>
   <p>title: {{ title }}</p><br>
 </div>
 
</template>
<script>
export default{
 data(){
  return{
   
  }
 },
 // props 数组类型,其中保存父级传入子级数据时,标签上的属性名称
 props:["msg","title"]
}
</script>
<style scoped>
.div{
 border: 1px solid;
}</style>

>Parent.vue
<template>
 <h1>父类组件</h1><br>
 <ChildDemo msg="专注写bug 父级传入子级数据" :title="tittleMsg"/>
</template>
<script>
// 父类中引入子类
import Child from './Child.vue';
export default{
 data(){
  return{
    tittleMsg:"父级传入子级信息2"
  }
 },
 // script 增加 setup,则不能写逻辑,出现报错,所以此处手动注入
 components:{
  // key-value 结构   别名:对应引入子类
  ChildDemo:Child
 }
}
</script>

案例效果展示:
在这里插入图片描述

其他类型数据(数字、数组、对象)传递

如果按照Java语言理解,就很简单。

万物皆对象。既然字符串是这种方式,那么其他类型也大差不差了!

直接看例子:

Parent.vue

<template>
 <h1>父类组件</h1><br>
 <ChildDemo msg="专注写bug 父级传入子级数据" 
  :title="tittleMsg" 
  :age="userAge" 
  :arrays="userLists" 
  :userInfo="userInfos" />
</template>
<script>
// 父类中引入子类
import Child from './Child.vue';
export default{
 data(){
  return{
    tittleMsg:"父级传入子级信息2", // 字符串
    userAge:28, // number 数字类型
    userLists:["lilei","jack","tom"], // 数组类型
    userInfos:{  // object 对象类型
     id:5173,
     name:"lilei"
    }
  }
 },
 // script 增加 setup,则不能写逻辑,出现报错,所以此处手动注入
 components:{
  // key-value 结构   别名:对应引入子类
  ChildDemo:Child
 }
}
</script>

Child.vue

<template>
 <div class="div">
   <h1>子类组件</h1><br>
   <p>msg: {{ msg }}</p><br>
   <p>title: {{ title }}</p><br>
   <p>age: {{ age }}</p><br>
   <ul>
    <li v-for="(item,index) of arrays" :key="index">{{ item }}</li>
   </ul>

   <p>用户基本信息编号:{{ userInfo.id  }} </p>
   <p>用户基本信息名称: {{ userInfo.name }}</p>
 </div>
 
</template>
<script>
export default{
 data(){
  return{
   
  }
 },
 props:["msg","title","age","arrays","userInfo"]
}
</script>
<style scoped>
.div{
 border: 1px solid;
}</style>

注意事项

props传递数据操作时,只能从父级传递至子级中,即:从外至内

不能反其道而行!

数据传递值校验

在上面的案例中,父级组件Parent.vue向子级组件Child.vue进行了传递数据测试。除了能满足数据传递之外,props还能针对传递的数据限定类型若不存在填充默认值等操作。

限定数据类型 type

比如父级中传递的userAgeString类型,若子级组件中定义的是Number类型。则会出现什么样的问题呢?看下面的案例。

ComponentA.vue

<template>
 <h1>父类组件</h1><br>
 <ComponentBDemo 
  :age="userAge"  />
</template>
<script>
// 父类中引入子类
import ComponentB from './ComponentB.vue';
export default{
 data(){
  return{
    userAge:"28", // 传递字符串类型
  }
 },
 // script 增加 setup,则不能写逻辑,出现报错,所以此处手动注入
 components:{
  // key-value 结构   别名:对应引入子类
  ComponentBDemo:ComponentB
 }
}
</script>

在子级组件中的props换一个写法,指定数据的类型。

ComponentB.vue

<template>
 <h1>子级组件</h1><br>
 <p>age: {{ age }}</p><br>
</template>
<script>
export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{ // 限定类型
   type:Number
  }
 }
}
</script>

运行后,浏览器查看显示效果。
在这里插入图片描述
【发现】限定类型后,父级组件传递的是String类型,但子级组件限定的是Number类型,类型不一致出现了警告!

当然,在子级组件中,可以针对多个可能的类型进行限制,比如满足传入的数据是StringNumber等。
修改子级组件ComponentB.vue

<template>
 <h1>子级组件</h1><br>
 <p>age: {{ age }}</p><br>
</template>
<script>
export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{
   //type:Number // 限定单个类型
   type:[Number,String,Object,Array] // 支持多种类型范围
  }
 }
}
</script>

刷新浏览器,查看信息。
在这里插入图片描述

给定默认值 default

如果子级组件中定义了某个变量的显示项,但在父级中未传入对应的值,此时子级组件在渲染显示的时候,不会将该变量标签进行显示。

ComponentB.vue

<template>
 <h1>子级组件</h1><br>
 <p>age: {{ age }}</p><br>
 <p>{{ userName }}</p><br>
</template>
<script>
export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{
   //type:Number // 限定单个类型
   type:[Number,String,Object,Array]
  },
  userName:{
   type:String
  }
 }
}
</script>

子级组件定义userName变量的显示,但父级未传递值,此时浏览器中的显示信息如下:
在这里插入图片描述

如果说父级组件未传递值时,需要子级组件中默认显示一些信息,可以写成下面这种形式。

<template>
 <h1>子级组件</h1><br>
 <p>age: {{ age }}</p><br>
 <p>{{ userName }}</p><br>
</template>
<script>
export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{
   //type:Number // 限定单个类型
   type:[Number,String,Object,Array]
  },
  userName:{
   type:String,
   default:"父级未传递值,默认显示这句话!"
  }
 }
}
</script>

核心就是针对未传递值的变量增加default标识 。

export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{
   //type:Number // 限定单个类型
   type:[Number,String,Object,Array]
  },
  userName:{
   type:String,
   default:"父级未传递值,默认显示这句话!"
  }
 }
}

此时页面的显示效果如下所示:
在这里插入图片描述


如果父级传递了数据。那么显示效果又是怎么样的呢? >ComponentA.vue

在这里插入图片描述
此时浏览器中的显示效果如下所示:
在这里插入图片描述
【注意】数字Number和字符串String类型,可以直接指定default默认值。如果是对象或者数组类型,则需要使用工厂函数返回默认值!

验证数组类型的数据默认值定义。

<template>
 <h1>子级组件</h1><br>
 <p>age: {{ age }}</p><br>
 <p>{{ userName }}</p><br>
 <ul>
    <li v-for="(item,index) of arrays" :key="index">{{ item }}</li>
   </ul>
</template>
<script>
export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{
   //type:Number // 限定单个类型
   type:[Number,String,Object,Array]
  },
  userName:{
   type:String,
   default:"父级未传递值,默认显示这句话!"
  },
  arrays:{ // 数组类型的变量
   type:Array,
   default(){ // 工厂函数返回默认对象
    return ["这只是默认的数组展示项"]
   }
  }
 }
}
</script>

数组类型默认值展示效果:
在这里插入图片描述

指定必选项 required

在上面说了一个显示效果:

如果父级未传递指定变量数据,则在子级组件中会渲染对应的标签,但不会给变量赋值!

如果必须强制指定必须传递对应的值,此时则需要使用到required:true标识。如下所示:

父级未传递值msg,子级组件对应变量指定必传!

<template>
 <h1>子级组件</h1><br>
 <p>age: {{ age }}</p><br>
 <p>{{ userName }}</p><br>
 <ul>
    <li v-for="(item,index) of arrays" :key="index">{{ item }}</li>
   </ul>
</template>
<script>
export default{
 data(){
  return{
    
  }
 },
 props:{
  age:{
   //type:Number // 限定单个类型
   type:[Number,String,Object,Array]
  },
  userName:{
   type:String,
   default:"父级未传递值,默认显示这句话!"
  },
  arrays:{
   type:Array,
   default(){
    return ["这只是默认的数组展示项"]
   }
  },
  msg:{ // 父级未传递该变量
   type:String,
   required:true
  }
 }
}
</script>

此时浏览器中的显示效果如下:
在这里插入图片描述

丢失必选项msg值。

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

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

相关文章

宇宙探索:假如把银河系缩小到一个电子那么小,那宇宙会有多大?

“你知道银河系有多大吗?”“我们可以看到的宇宙有多大呢?”“那么假如把银河系缩小到一个电子那么小&#xff0c;那么我们可以看到的宇宙会有多大呢?”这样一个看似简单的问题却没有一个简单的答案&#xff0c;那么蕴藏其中的玄机是什么? 一、光是无法照亮宇宙的角落。 从…

思维,1209G1 - Into Blocks (easy version)

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1209G1 - Codeforces 二、解题报告 1、思路分析 考虑&#xff1a; 最终状态为若干段相同数字&#xff0c;且任意两段数字不同 每个数字出现的最左下标和最右下标构成一个区间 连锁反应—…

月薪12万招聘AI人才,AI已成为大公司的竞争,小公司难以生存

前言 AI已经成为了时代的风口&#xff0c;这个风口的风力有多大呢&#xff1f; 一个月12-20万。 对&#xff0c;一个月120000-200000元&#xff01; 如果说&#xff0c;步入2024年最火的是什么&#xff0c;那一定就是ChatGPT所引领的开放式AI了&#xff0c;这个东西有多火呢…

AI绘画入门指南!一遍就会!AI绘画Stable Diffusion新手入门教程

我们尝试了一段时间Midjourney&#xff0c;发现其对图片的可控性较弱。于是研究起了Stable Diffusion。 SD的主要优势在于开源&#xff0c;因为开源会有很多无私的大佬分享自己的模型、插件及脚本等&#xff0c;让SD有了更丰富的扩展。在画面统一性和更像本人方面要比MJ容易实…

C++之虚函数与多态

1、多态 前面三种称为静态绑定&#xff08;静态多态&#xff09;&#xff0c;最后面的虚函数&#xff0c;则称为动态绑定&#xff08;动态多态&#xff09;。 2、静态绑定与动态绑定 要实现动态绑定&#xff0c;就必须使用虚函数。 3、虚函数 只有当你在&#xff1a;基类的指…

Mysql 常用命令 详细大全【分步详解】

1、启动和停止MySQL服务 // 暂停服务 默认 80 net stop mysql80// 启动服务 net start mysql80// 任意地方启动 mysql 客户端的连接 mysql -u root -p 2、输入密码 3、数据库 4、DDL&#xff08;Data Definition Language &#xff09;数据 定义语言, 用来定义数据库对象(数…

手机怎么压缩图片?通过三种压缩操作

手机怎么压缩图片&#xff1f;在智能手机日益普及的今天&#xff0c;拍照分享已成为日常生活的一部分。然而&#xff0c;高质量的照片往往占用较大的存储空间&#xff0c;且在网络上传输时速度较慢。那么&#xff0c;如何在手机上压缩图片呢&#xff1f;本文将介绍三种实用的手…

C/C++图形库Easyx的使用教学

绘制简单的图形窗口 学会创建图形化窗口 包含头文件 graphics.h包含已被淘汰的函数easyx.h包含最新的函数 两个函数就可以创建窗口 Initgraph&#xff08;&#xff09;函数的定义 图形窗口的创建 #include<graphics.h>int main() {initgraph(800, 600);while (1);…

90%国际3A游戏发行商的首选,一文揭秘语音驱动面部动画生成技术!

在科技迅猛发展的时代&#xff0c;AI 正以破竹之势重塑着我们的世界。从激烈的“百模大战”到应用层生态的“百花齐放”&#xff0c; AIGC 产业迎来了快速增长的爆发期。AIGC 引领的创新应用&#xff0c;正推动着包括动漫游戏产业在内的各行各业加速升级。随着 AIGC 技术的不断…

SVN安装详细教程

&#x1f4d6;SVN安装详细教程 ✅1. 下载✅2. 安装✅3. 使用 ✅1. 下载 官方地址&#xff1a;https://tortoisesvn.net/downloads.html 123云盘地址&#xff1a;https://www.123pan.com/s/4brbVv-rsoWA.html ✅2. 安装 双击TortoiseSVN-1.14.6.29673-x64-svn-1.14.3.msi安装…

Kafka消费者api编写教程

1.基本属性配置 输入new Properties().var 回车 //创建属性Properties properties new Properties();//连接集群properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"node1:9092,node2:9092");//反序列化properties.put(ConsumerConfig.KEY_DESERIALIZER_CL…

云端狂飙:Django项目部署与性能优化的极速之旅

Hello&#xff0c;我是阿佑&#xff0c;这次阿佑将手把手带你亲自踏上Django项目从单机到云端的全过程&#xff0c;以及如何通过Docker实现项目的无缝迁移和扩展。不仅详细介绍了Docker的基本概念和操作&#xff0c;还深入探讨Docker Compose、Swarm和Kubernetes等高级工具的使…

车辆路径规划之Dubins曲线与RS曲线简述

描述 Dubins和RS曲线都是路径规划的经典算法&#xff0c;其中车辆运动学利用RS曲线居多&#xff0c;因此简单介绍Dubins并引出RS曲线。 花了点时间看了二者的论文&#xff0c;并阅读了一个开源的代码。 Dubins曲线 Dubins曲线是在满足曲率约束和规定的始端和末端的切线&#…

【python】IndexError: Replacement index 1 out of range for positional args tuple

成功解决“IndexError: Replacement index 1 out of range for positional args tuple”错误的全面指南 一、引言 在Python编程中&#xff0c;IndexError: Replacement index 1 out of range for positional args tuple这个错误通常发生在使用str.format()方法或者f-string&am…

网络编程 —— Http使用httpClient实现页面爬虫

先去找类型的a标签 取出图片所在网址 取出https://desk.3gbizhi.com/deskMV/438.html 搭建Form界面 Http类 public static HttpClient Client { get; } static Http() {HttpClientHandler handler new HttpClientHandler();//处理消息对象//ServerCertificateCustomValidat…

NeuralForecast TokenEmbedding 一维卷积 (Conv1d) 与矩阵乘法

NeuralForecast TokenEmbedding 一维卷积 (Conv1d) 与矩阵乘法 flyfish TokenEmbedding中使用了一维卷积 (Conv1d) TokenEmbedding 源码分析 在源码的基础上增加调用示例 下面会分析这段代码 import torch import torch.nn as nn class TokenEmbedding(nn.Module):def __i…

刷机 iPhone 进入恢复模式

文章目录 第 1 步&#xff1a;确保你有一台电脑&#xff08;Mac 或 PC&#xff09;第 2 步&#xff1a;将 iPhone 关机第 3 步&#xff1a;将 iPhone 置于恢复模式第 4 步&#xff1a;使用 Mac 或 PC 恢复 iPhone需要更多协助&#xff1f; 本文转载自&#xff1a;如果你忘记了 …

手写mybatis-预编译sql语句

sql表 mybatis数据库中的gxa_user表 /*Navicat Premium Data TransferSource Server : rootSource Server Type : MySQLSource Server Version : 80028Source Host : localhost:3306Source Schema : mybatisTarget Server Type : MySQLTarget…

图解DSPy:Prompt的时代终结者?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

Windows Linux下查看静态库,动态库各种命令的总结

Windows环境下查看库文件 静态库(.lib) 使用lib.exe查看库内容 命令示例:lib /list C.lib使用dumpbin.exe查看库的详细信息 命令示例:dumpbin /headers C.lib动态链接库(.dll) 使用dumpbin.exe查看DLL的导出信息 命令示例:dumpbin /exports B.dll