当前位置: 首页 > news >正文

vue3中的Props

Props声明

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

在使script setup的单文件中,props可以使用 ==defineProps()==宏来声明:

<script setup>
const props= defineProps(['foo'])console.log(props.foo)
<script>

在没有使用script setup的组件中,prop可以使用props选项来声明:

export default{props:['foo'],setup(props){//接收props作为第一个参数console.log(props.foo)}
}

注意传递给defineProps的参数和提供给props选项的值是相同的,两种声明方式背后其实使用的都是prop选项。
除了使用字符串数组来声明prop外,还可以使用对象的形式:

//使用<script setup>
defineProps({title:String,likes:Number}
}
//使用非<script setup>
export default{props:{title:String,likes:Nunber}}

对于以对象形式声明中的每个属性,key是prop的名称,而值则是该prop预期类型的构造函数。比如,如果要求一个prop的值是number类型,则可以使用Number构造函数作为其声明的值。
对象形式的props声明不仅可以一定程度上作为组件的文档,而且如果其他开发者在使用你的组件时,传递错误的类型,也会在浏览器控制台中抛出警告。我们将在本章节稍后进一步讨论有关 prop 校验的更多细节。
如果你正在搭配 TypeScript 使用

<script setup lang='ts'>
defineProps<{title?:stringlikes?:number}>()
</script>

传递prop的细节

Prop名字格式

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

defineProps({greetingMessage: String
})
<span>{{ greetingMessage }}</span>

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

<MyComponent greeting-message='hello'/>

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

静态vs动态 prop

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

<BlogPost title='My journey whit 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 而非属性

const post = {id: 1,title: 'My Journey with Vue'
}

以及下面的模板:

<BlogPost v-bind="post" />

而这实际上等价于:

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

单向数据流

所有的props都遵循着单向绑定原则,props因父组件的更新而变化,自然地将新状态向下流往子组件,而不会逆向传递。这避免了子组件意外修改父组件的状态的情况,不然应用的数据流将会很容易变得混乱而难以理解。
另外,每次父组件更新完后,所有的子组件中的props都会被更新到最新值,这意味着你不应该在子组件中去修改一个prop。否则会抛出警告:

const props = defineProps(['foo'])// ❌ 警告!prop 是只读的!
props.foo = 'bar'

导致你想要更改一个prop的需求通常来之以下两种场景:
1.prop被用于传入初始值,而子组件想在之后将其作为一个局部数据属性。爱这种情况下,最好是新定义一个局部数据属性,从props上获取初始值即可:

const props =defineProps(['initialCounter'])
// 计数器只是将 props.initialCounter 作为初始值
// 像下面这样做就使 prop 和后续更新无关了
const counter = ref(props.initialCounter)

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

const props = defineProps(['size'])// 该 prop 变更时计算属性也会自动更新
const normalizedSize = computed(() => props.size.trim().toLowerCase())

更改对象 / 数组类型的 props

当对象或数组作为 props 被传入时,虽然子组件无法更改 props 绑定,但仍然可以更改对象或数组内部的值。这是因为 JavaScript 的对象和数组是按引用传递,而对 Vue 来说,禁止这样的改动,虽然可能生效,但有很大的性能损耗,比较得不偿失。

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

相关文章:

vue3中的Props

Props声明 一个组件需要显示声明它所接受的props&#xff0c;这样vue才能知道外部传入的哪些是props&#xff0c;哪些是透传attribute 在使script setup的单文件中&#xff0c;props可以使用 defineProps()宏来声明&#xff1a; <script setup> const props definePro…...

ElasticSearch搜索技术深入与聚合查询实战

ES分词器详解 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词发生时…...

vue+element ui中的el-button自定义icon图标

实现 button的icon属性自定义一个图标名称&#xff0c;这个自定义的图标名称会默认添加到button下i标签的class上&#xff0c;我们只需要设置i标签的样式就可以了 ##3. 按钮上使用自定义的icon 完整代码 <div class"lookBtn"><el-button icon"el-icon-…...

PyQt5:构建目标检测算法GUI界面 (附python代码)

文章目录 1.界面2.代码3.Analyze 1.界面 目标检测算法一般就是检测个图片&#xff0c;然后显示图片结果。 最简单的情况&#xff0c;我们需要一个按钮读取图片&#xff0c;然后后有一个地方显示图片。 2.代码 import sys import numpy as np from PIL import Imagefrom PyQt…...

SV-10A-4G IP网络报警非可视终端 (4G版)

SV-10A-4G IP网络报警非可视终端 &#xff08;4G版&#xff09; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.621e3d0dpv5knb&ftt&id745728046948 产品简介&#xff1a; 通过局域网/广域网网组网的网络报警系统&#xff0c;改变传统局域网组网…...

对xml文本元素赋值

public static void main(String[] args) {Map map ....;//数据Iterator it doc.getRootElement().elementIterator();//doc是xml模板//将元素ID与输入框的值放在map中while (it.hasNext()) {org.dom4j.Element nextRoot (org.dom4j.Element) it.next();Iterator nextIt ne…...

【k8s】资源管理命令-陈述式

一、资源管理介绍 1、资源管理概念 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 //kubernetes的本质就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;起始就是在kubernetes集群中运行一个个…...

无需频繁登录支付宝网站即可完成商家转账,实时到账,方便安全快捷

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…...

Vue 监听属性 watchEffect

watchEffect 函数&#xff1a;自动收集依赖源&#xff0c;不用指定监听哪个数据&#xff0c;在监听的回调中用到哪个数据&#xff0c;就监听哪个数据。 而 watch 函数&#xff1a;既要指定监听的数据&#xff0c;也要指定监听的回调。 watchEffect 函数&#xff1a;类似于 co…...

设计模式: 关于项目架构,技术选型,技术债务问题与解决方案

正确的选择是良好的开端 1 &#xff09;指标 系统稳健性系统健壮性 2 ) 衡量 在概念层次衡量架构质量在实际开发中衡量架构好坏 3 ) 架构分类 系统架构 从系统维度&#xff0c;负责整体系统的架构设计基础服务和各系统间协调&#xff0c;着眼全局比如关注负载&#xff0c…...

el-tabs 默认选中第一个

1. 实际开发中el-tabs 都会设置第一个为默认值 ,这样会好看一点, 而渲染的数据经常是通过后端返回的数据 , v-model 无法写死默认值 解决办法 , 通过计算机属性 ,在data 定义一个 selectedTab watch: {defaultTab(newVal) {this.selectedTab newVal; // 设置第一个标签页…...

R -- match,pmatch,charmatch

文章目录 matchpmatchcharmatch match ?matchDescription match returns a vector of the positions of (first) matches of its first argument in its second. 第一个向量中的元素在第二个向量中的位置&#xff0c;如果第二个向量中有多个仅返回第一个match 元素的位置&…...

数据结构——线性表①(顺序表)

一、线性表定义 线性表是一种数据结构&#xff0c;它是由n个具有相同数据类型的数据元素a1,a2,…,an组成的有限序列。 其中&#xff0c;除第一个元素a1外&#xff0c;每一个元素有且只有一个直接前驱元素&#xff0c;除了最后一个元素an外&#xff0c;每一个元素有且只有一个…...

MFC网络编程-Udp客户端

目录 1、UI的设计&#xff1a; 2、代码的实现&#xff1a; &#xff08;1&#xff09;、重写CSocket虚函数OnReceive&#xff0c;并且传入对话框的指针 &#xff08;2&#xff09;、初始化SOCKET &#xff08;3&#xff09;、绑定本地IP和端口 &#xff08;4&#xff09;、…...

密码学基础

密码学总览 信息安全面临的危险与应对这些威胁的密码技术&#xff1a; 关于上图中的威胁&#xff0c;这里在简单的说明&#xff1a; 窃听&#xff1a;指的是需要保密的消息被第三方获取。篡改&#xff1a;指的是消息的内容被第三方修改&#xff0c;达到欺骗的效果。伪装&…...

[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb

一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…...

拥抱AI-ChatGPT:人类新纪元

最近大模型通用智能应用持续发酵&#xff0c;各大科技公司都陆续推出了基于通用大模型的智能应用产品&#xff0c;典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了&#xff0c;从去年年底推出到现在已经有很…...

基于深度学习的人脸表情识别 计算机竞赛

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…...

GitHub经常打不开或者访问解决办法

访问慢或无法访问的原因&#xff1a;DNS解析是最为基础的一个环节。由于Github的服务器在全球各地&#xff0c;域名解析所需的时间也会不同&#xff0c;这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决&#xff1a;查询到github对应的IP&#xff0c;然后在host…...

密码学 - SHA-2

实验八 SHA-2 1.实验目的 熟悉SHA – 2算法的运行过程&#xff0c;能够使用C语言编写实现SHA-2算法程序&#xff0c;增加对摘要函数的理解。 2、实验任务 &#xff08;1&#xff09;理解SHA-2轮函数的定义和常量的定义。 &#xff08;2&#xff09;利用VC语言实现SHA-2算…...

清音刻墨Qwen3部署到使用:一条命令搭建,五分钟出成果

清音刻墨Qwen3部署到使用&#xff1a;一条命令搭建&#xff0c;五分钟出成果 1. 引言&#xff1a;重新定义字幕制作体验 在视频内容爆炸式增长的今天&#xff0c;字幕制作成为了许多创作者的心头之痛。传统的手动打字对时间轴不仅耗时耗力&#xff0c;而且很难达到专业级的精…...

项目建议书、可研报告与初步设计方案的定位与关联

在信息化项目建设过程中&#xff0c;项目建议书、可行性研究报告&#xff08;以下简称“可研报告”&#xff09;和初步设计方案是前期工作阶段最为核心的三份文件&#xff0c;它们共同构成了项目从构想到落地的决策链条&#xff0c;承担着不同阶段的论证与规划职责。然而实际工…...

constexpr + consteval + constinit 三重锁性能模型(工业级嵌入式系统内存占用压缩41%,启动时间缩短至23ms)

第一章&#xff1a;constexpr consteval constinit 三重锁性能模型概览C20 引入的 constexpr、consteval 和 constinit 构成了一套分层编译期约束体系&#xff0c;共同构成现代 C 静态性能保障的“三重锁”模型。它们并非替代关系&#xff0c;而是按语义强度递进&#xff1a;…...

CANopen网络管理NMT避坑指南:从心跳报文0x7F看懂节点状态与PDO失效原因

CANopen网络管理NMT实战诊断&#xff1a;从心跳报文解码到PDO失效精准定位 当你在调试一个由二十多个CANopen节点组成的自动化产线时&#xff0c;突然发现3号工位的传感器数据停止更新——这种场景对工业现场工程师来说再熟悉不过。更棘手的是&#xff0c;CAN分析仪上不断刷新的…...

14 - SVM的用户态API接口

难度: 🟡🔴 中级 预计学习时间: 2小时 前置知识: 第4章(核心数据结构)、第6章(范围管理) 📋 概述 SVM(Shared Virtual Memory)的用户态接口是上层框架(ROCm runtime、HSA runtime)与内核驱动之间的唯一公开契约。整个SVM用户态API只有一个IOCTL命令 AMDKFD_IOC_…...

培养孩子批判性思维5W1H,从学会提问开始

1. 何为批判性思维&#xff1f;在《单向度的人》中&#xff0c;哲学家马尔库赛说&#xff1a;人类有两种思维&#xff0c;一种肯定&#xff0c;一种批判&#xff0c;缺乏任何一种都不算是健全的。 简单来讲&#xff0c;批判性思维就是一种理性的能力&#xff0c;当面对权威发出…...

利用Aspera高效上传16S rDNA数据至NCBI的完整指南

1. 为什么选择Aspera上传16S rDNA数据 第一次尝试向NCBI上传16S rDNA测序数据时&#xff0c;我像大多数人一样直接使用网页上传工具。结果一个2GB的fastq文件传了整整8小时&#xff0c;中途还断连了3次。后来改用Aspera命令行工具&#xff0c;同样的文件只用了12分钟就稳定传完…...

双向链表添加节点实现分析

链表节点结构class Node {private Object obj;private Node pre;private Node next;public Node(Object obj, Node pre, Node next) {this.obj obj;this.pre pre;this.next next;} }节点包含三个字段&#xff1a;存储数据的obj&#xff0c;指向前驱节点的pre&#xff0c;指向…...

Halcon卡尺直线检测避坑指南:参数设置与常见错误排查

Halcon卡尺直线检测避坑指南&#xff1a;参数设置与常见错误排查 在工业视觉检测领域&#xff0c;直线边缘的精准定位是许多项目的基础需求。Halcon作为行业标杆工具&#xff0c;其卡尺直线检测功能看似简单&#xff0c;却暗藏诸多参数陷阱。不少开发者在初次接触时&#xff0…...

IDM 下载管理器 下载安装

链接: https://pan.baidu.com/s/1IJ4LrAAZCfVvPyZl9VVg8g 提取码: j9c9解压前请退出所有杀毒软件或添加排除项&#xff01;&#xff01;&#xff01;此文件无毒&#xff0c;可放心使用&#xff01;&#xff01;&#xff01;此文件为免费开源绿色软件&#xff0c;请勿利用于商业…...