【VUE入门级温故知新】一文向您详细介绍~组件属性Props(选项式API)

大家好,我是DX3906

🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地!🎇

前面和大家分享了《如何从零开始创建一个 Vue 应用》

                             《VUE模板语法(超详细讲解)》

                             《一文向您详细介绍~Vue响应式基础(选项式API)》

                             《一文向您详细介绍~Vue计算属性computed(选项式API)》

                             《一文向您详细介绍~Class类 与 Style样式 绑定(选项式API)》

                             《一文向您详细介绍~条件渲染(选项式API)》

                             《一文向您详细介绍~列表渲染(选项式API)》

                             《一文向您详细介绍~事件处理v-on(选项式API)》

                             《一文向您详细介绍~模板引用ref(选项式API)》

                             《一文向您详细介绍~侦听器watch》

                             《一文向您详细介绍~组件注册(选项式API)》

今天和大家共同学习一下Vue基于组合式API的组件属性Props

 什么是Props

一个组件需要显式声明它所接受的 props,这样 Vue 才能知道外部传入的哪些是 props,哪些是透传 attribute 。

props 需要使用 props 选项来定义

export default {props: ['foo'],created() {// props 会暴露到 `this` 上console.log(this.foo)}
}

除了使用字符串数组来声明 props 外,还可以使用对象的形式:

export default {props: {title: String,likes: Number}
}

对于以对象形式声明的每个属性,key 是 prop 的名称,而值则是该 prop 预期类型的构造函数。比如,如果要求一个 prop 的值是 number 类型,则可使用 Number 构造函数作为其声明的值。

对象形式的 props 声明不仅可以一定程度上作为组件的文档,而且如果其他开发者在使用你的组件时传递了错误的类型,也会在浏览器控制台中抛出警告。

传递 prop 的细节

Prop 名字格式​

如果一个 prop 的名字很长,应使用 camelCase 形式,因为它们是合法的 JavaScript 标识符,可以直接在模板的表达式中使用,也可以避免在作为属性 key 名时必须加上引号。

export default {props: {greetingMessage: String}
}
<span>{{ greetingMessage }}</span>

虽然理论上你也可以在向子组件传递 props 时使用 camelCase 形式,但实际上为了和 HTML attribute 对齐,我们通常会将其写为 kebab-case 形式:

<MyComponent greeting-message="hello" />

对于组件名我们推荐使用 PascalCase,因为这提高了模板的可读性,能帮助我们区分 Vue 组件和原生 HTML 元素。然而对于传递 props 来说,使用 camelCase 并没有太多优势,因此我们推荐更贴近 HTML 的书写风格。

静态 vs. 动态 Props

至此,你已经见过了很多像这样的静态值形式的 props:

<BlogPost title="My journey with Vue" />

相应地,还有使用 v-bind 或缩写 : 来进行动态绑定的 props:

<!-- 根据一个变量的值动态传入 -->
<BlogPost :title="post.title" /><!-- 根据一个更复杂表达式的值动态传入 -->
<BlogPost :title="post.title + ' by ' + post.author.name" />

传递不同的值类型

在上述的两个例子中,我们只传入了字符串值,但实际上任何类型的值都可以作为 props 的值被传递。

Number
<!-- 虽然 `42` 是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :likes="42" /><!-- 根据一个变量的值动态传入 -->
<BlogPost :likes="post.likes" />
Boolean
<!-- 仅写上 prop 但不传值,会隐式转换为 `true` -->
<BlogPost is-published /><!-- 虽然 `false` 是静态的值,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :is-published="false" /><!-- 根据一个变量的值动态传入 -->
<BlogPost :is-published="post.isPublished" />
Array
<!-- 虽然这个数组是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :comment-ids="[234, 266, 273]" /><!-- 根据一个变量的值动态传入 -->
<BlogPost :comment-ids="post.commentIds" />
Object
<!-- 虽然这个对象字面量是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost:author="{name: 'Veronica',company: 'Veridian Dynamics'}"/><!-- 根据一个变量的值动态传入 -->
<BlogPost :author="post.author" />

使用一个对象绑定多个 prop

如果你想要将一个对象的所有属性都当作 props 传入,你可以使用没有参数的 v-bind,即只使用 v-bind 而非 :prop-name。例如,这里有一个 post 对象:

export default {data() {return {post: {id: 1,title: 'My Journey with Vue'}}}
}

以及下面的模板:

<BlogPost v-bind="post" />

而这实际上等价于:

<BlogPost :id="post.id" :title="post.title" />

单向数据流

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

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

export default {props: ['foo'],created() {// ❌ 警告!prop 是只读的!this.foo = 'bar'}
}

导致你想要更改一个 prop 的需求通常来源于以下两种场景:

  1. prop 被用于传入初始值;而子组件想在之后将其作为一个局部数据属性。在这种情况下,最好是新定义一个局部数据属性,从 props 上获取初始值即可:

export default {props: ['initialCounter'],data() {return {// 计数器只是将 this.initialCounter 作为初始值// 像下面这样做就使 prop 和后续更新无关了counter: this.initialCounter}}
}

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

export default {props: ['size'],computed: {// 该 prop 变更时计算属性也会自动更新normalizedSize() {return this.size.trim().toLowerCase()}}
}

更改对象 / 数组类型的 props​

当对象或数组作为 props 被传入时,虽然子组件无法更改 props 绑定,但仍然可以更改对象或数组内部的值。这是因为 JavaScript 的对象和数组是按引用传递,对 Vue 来说,阻止这种更改需要付出的代价异常昂贵。

这种更改的主要缺陷是它允许了子组件以某种不明显的方式影响父组件的状态,可能会使数据流在将来变得更难以理解。在最佳实践中,你应该尽可能避免这样的更改,除非父子组件在设计上本来就需要紧密耦合。在大多数场景下,子组件应该抛出一个事件来通知父组件做出改变。

Prop 校验

Vue 组件可以更细致地声明对传入的 props 的校验要求。比如我们上面已经看到过的类型声明,如果传入的值不满足类型要求,Vue 会在浏览器控制台中抛出警告来提醒使用者。这在开发给其他开发者使用的组件时非常有用。

要声明对 props 的校验,你可以向 props 选项提供一个带有 props 校验选项的对象,例如:

export default {props: {// 基础类型检查//(给出 `null` 和 `undefined` 值则会跳过任何类型检查)propA: Number,// 多种可能的类型propB: [String, Number],// 必传,且为 String 类型propC: {type: String,required: true},// 必传但可为 null 的字符串propD: {type: [String, null],required: true},// Number 类型的默认值propE: {type: Number,default: 100},// 对象类型的默认值propF: {type: Object,// 对象或者数组应当用工厂函数返回。// 工厂函数会收到组件所接收的原始 props// 作为参数default(rawProps) {return { message: 'hello' }}},// 自定义类型校验函数// 在 3.4+ 中完整的 props 作为第二个参数传入propG: {validator(value, props) {// The value must match one of these stringsreturn ['success', 'warning', 'danger'].includes(value)}},// 函数类型的默认值propH: {type: Function,// 不像对象或数组的默认,这不是一个// 工厂函数。这会是一个用来作为默认值的函数default() {return 'Default function'}}}
}

一些补充细节:

  • 所有 prop 默认都是可选的,除非声明了 required: true

  • 除 Boolean 外的未传递的可选 prop 将会有一个默认值 undefined

  • Boolean 类型的未传递 prop 将被转换为 false。这可以通过为它设置 default 来更改——例如:设置为 default: undefined 将与非布尔类型的 prop 的行为保持一致。

  • 如果声明了 default 值,那么在 prop 的值被解析为 undefined 时,无论 prop 是未被传递还是显式指明的 undefined,都会改为 default 值。

当 prop 的校验失败后,Vue 会抛出一个控制台警告 (在开发模式下)。

运行时类型检查

校验选项中的 type 可以是下列这些原生构造函数:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol
  • Error

另外,type 也可以是自定义的类或构造函数,Vue 将会通过 instanceof 来检查类型是否匹配。例如下面这个类:

class Person {constructor(firstName, lastName) {this.firstName = firstNamethis.lastName = lastName}
}

你可以将其作为一个 prop 的类型:

export default {props: {author: Person}
}

Vue 会通过 instanceof Person 来校验 author prop 的值是否是 Person 类的一个实例。

可为 null 的类型

如果该类型是必传但可为 null 的,你可以用一个包含 null 的数组语法:

export default {props: {id: {type: [String, null],required: true}}
}

注意如果 type 仅为 null 而非使用数组语法,它将允许任何类型。

Boolean 类型转换

为了更贴近原生 boolean attributes 的行为,声明为 Boolean 类型的 props 有特别的类型转换规则。以带有如下声明的 <MyComponent> 组件为例:

export default {props: {disabled: Boolean}
}

该组件可以被这样使用:

<!-- 等同于传入 :disabled="true" -->
<MyComponent disabled /><!-- 等同于传入 :disabled="false" -->
<MyComponent />

当一个 prop 被声明为允许多种类型时,Boolean 的转换规则也将被应用。然而,当同时允许 String 和 Boolean 时,有一种边缘情况——只有当 Boolean 出现在 String 之前时,Boolean 转换规则才适用:

// disabled 将被转换为 true
export default {props: {disabled: [Boolean, Number]}
}// disabled 将被转换为 true
export default {props: {disabled: [Boolean, String]}
}// disabled 将被转换为 true
export default {props: {disabled: [Number, Boolean]}
}// disabled 将被解析为空字符串 (disabled="")
export default {props: {disabled: [String, Boolean]}
}

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~ 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp中H5网页怎么实现自动点击事件

<template><view><button ref"myButton" click"handleClick">点击我</button></view> </template><script> export default {mounted() {this.$nextTick(() > {const button this.$refs.myButton;console.l…

并发服务器---IO多路复用

单循环服务器&#xff1a;同一时刻只能处理一个客户端任务 并发服务器&#xff1a; 同一时刻&#xff0c;只能处理多个客户端的任务 实现方法&#xff1a;多进程 多线程 IO多路复用 IO多路复用&#xff1a; 1.阻塞io&#xff08;fgets scanf recv getchar read&#x…

算法的学习笔记—数据流中的中位数(牛客JZ41)

&#x1f600;前言 在处理动态数据时&#xff0c;实时计算中位数是一个经典问题。中位数是排序后处于中间位置的数值&#xff0c;数据流中的中位数计算面临两个挑战&#xff1a;首先是数据量的动态变化&#xff0c;其次是需要保持元素的有序性。为了高效地解决这个问题&#xf…

并发式服务器

并发式服务器是一种设计用来同时处理多个客户端请求的服务器。这种服务器能够提高资源利用率和响应速度&#xff0c;适用于需要服务大量用户的网络应用。以下是并发式服务器的一些关键特点&#xff1a; 多任务处理&#xff1a;并发式服务器能够同时处理多个任务或请求&#xff…

DDOS攻击学习-渗透测试-域名信息收集

文章目录 wordpress漏洞利用域名信息收集域名介绍域名分类 whoiswhois反查子域名收集子域名发现网络空间安全搜索引擎SSL证书查询js文件发现子域名 wordpress漏洞利用 这个一般都需要安装wordpress服务使用wpscan扫描&#xff0c;但现在一般很少人知道或者使用wordpress所以这个…

Mysql的查询指令

整理了一些Mysql的查询语句&#xff0c;希望对大家有帮助&#xff0c;祝大家心想事成万事如意&#xff01; 基本查询 select 字段 from 表名 where 条件&#xff1b; 排序查询 select 字段 from 表名 order by 排序字段 [asc升序|desc降序] limit 前几行/中间几行&#xff1…

美股投资迷思大揭秘:理性投资,绕开六大陷阱

你是否也对美股投资充满了期待&#xff0c;但又担心踏入误区&#xff1f;美股市场作为全球金融的璀璨明珠&#xff0c;吸引着无数投资者的目光&#xff0c;但同时也伴随着一些常见的误解。今天&#xff0c;我们就来一一拆解这些迷思&#xff0c;助你美股投资之路更加顺畅&#…

产品中的影响力六大原则

罗伯特B西奥迪尼(Robert B. Cialdini)是全球知名的说服术与影响力研究权威专家。他在著作《影响力&#xff1a;说服心理学》中提出有效的影响和说服必须遵循统一的六项心理学原则&#xff1a;互惠、承诺与一致、社会认同、喜好、权威和稀缺性。不论在生活还工作中我们或多或少会…

算法-有效的字母异位词

这道题很简单&#xff0c;就不做过多的解释&#xff0c;只需要创建一个哈希表统计s中出现的次数&#xff0c;然后遍历t&#xff0c;如果没找到&#xff0c;或者找到了但是次数为0则返回错误&#xff0c;否则返回true。代码如下&#xff1a; class Solution { public:bool isAn…

【python】Python如何通过FFmpeg处理音视频

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

06:【江科大stm32】:定时器输入捕获功能

定时器输入捕获功能 1、通过定时器的输入捕获功能测量PWM波的频率2、PWMI模式测量频率和占空比 1、通过定时器的输入捕获功能测量PWM波的频率 定时器标准库相关的编程接口&#xff1a; ①PWM.c文件的代码如下&#xff1a; /*通过定时器TIM2生成一个分辨率为10us,频率为1KHz的…

RabbitMQ中的死信交换机?(RabbitMQ延迟队列有了解过吗)

延迟队列 延迟队列:进入队列的消息会被延迟消费的队列。 延迟队列死信交换机 TTL&#xff08;过期时间&#xff09; 延迟队列的使用场景:超时订单、限时优惠、定时发布 死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信(dead letter): 消费者使…

iOS工程:获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字

【iOS工程】获取手机相册权限&#xff0c;iOS原生系统弹窗, Privacy隐私政策选择&#xff0c;如何添加系统弹出并修改描述文字 设备/引擎&#xff1a;Mac&#xff08;11.6&#xff09;/Mac Mini 开发工具&#xff1a;Xcode&#xff08;15.0.1&#xff09; 开发需求&#xff…

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

文章目录 【Java设计模式】Builder模式&#xff1a;在Java中清晰构建自定义对象一、概述二、Builder设计模式的意图三、Builder模式的详细解释及实际示例四、Java中Builder模式的编程示例五、Builder模式类图六、Java中何时使用Builder模式七、Builder模式的优点和权衡八、源码…

YOLO-World: Real-Time Open-Vocabulary Object Detection:实时开放词汇对象检测

YOLO系列探测器已成为高效实用的工具。然而&#xff0c;它们对预定义和训练的对象类别的依赖限制了它们在开放场景中的适用性。针对这一限制&#xff0c;我们引入了YOLO-World&#xff0c;这是一种创新方法&#xff0c;通过视觉语言建模和大规模数据集的预训练&#xff0c;增强…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…

Aigtek功率放大器应用领域分享:无处不在的MEMS传感器

微机电系统&#xff08;MEMS,Micro-Electro-MechanicalSystem&#xff09;&#xff0c;也叫做微电子机械系统、微系统、微机械等&#xff0c;指尺寸在几毫米乃至更小的高科技装置。微机电系统其内部结构一般在微米甚至纳米量级。微机电系统是在微电子技术&#xff08;半导体制造…

分布式基础理论——CAP理论和BASE理论

文章目录 CAP 理论BASE 理论参考资料 CAP 理论 CAP定理&#xff08;CAP theorem&#xff09;指出&#xff0c;在分布式系统中&#xff0c;设计读写操作时只能同时满足以下三个特性中的两个&#xff1a; 一致性&#xff08;Consistency&#xff09; : 所有节点访问同一份最新的…

ssm基于微信小程序的食堂窗口自助点餐系统源码调试讲解

1. 环境搭建 JDK 1.8&#xff1a;确保您的系统已安装JDK 1.8&#xff0c;并配置好环境变量。JDK 1.8 是目前很多Java项目仍在使用的稳定版本&#xff0c;适用于SSM框架。Tomcat 7&#xff1a;安装并配置Tomcat 7作为您的Web服务器。Tomcat 7 支持Servlet 3.0和JSP 2.2&#xf…

杰发科技AC7801——Flash模拟EEP内存(2)

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容&#xff0c;等到打印完成 计算符合&#xff0c;从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t&#xff0c;因此最大值是65536&#xff0c;写65536…