vue3中的Props

这篇具有很好参考价值的文章主要介绍了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?:string
	likes?: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 来说,禁止这样的改动,虽然可能生效,但有很大的性能损耗,比较得不偿失。

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

到了这里,关于vue3中的Props的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(40)
  • Vue2和Vue3是Vue.js框架的两个主要版本,它们之间有以下区别

    性能优化:Vue3在内部进行了重写,采用了更高效的虚拟DOM算法,使得渲染速度更快,性能更好。 更小的体积:Vue3的体积比Vue2更小,这意味着更快的下载和加载速度。 Composition API:Vue3引入了Composition API,它是一种新的组合式API,可以更好地组织和重用组件逻辑,使得代码更

    2024年02月15日
    浏览(38)
  • Vue2 watch监听props的值

    再次遇到监听子组件收到父组件传过来的值,如果这个值变化,页面中的值发现是不会跟着同步变化的。所以监听props中的值,一直监听。   代码:  

    2024年02月13日
    浏览(30)
  • vue3中的excel表导出功能(选中导出或导出所有,也可支持vue2)

    1.安装模块 npm install xlsx file-saver -S 2.文件导入 import * as XLSX from \\\"xlsx\\\"; import FileSaver from \\\"file-saver\\\" 3.整体代码(可选中导出或导出所有) id绑定表格全部导出 4.效果如下        

    2024年02月17日
    浏览(32)
  • 【vue2中的pdf预览】iframe/pdf.js/vue-pdf

    vue2中预览pdf的方法有pdf.js和vue-pdf等。下面进行简单对比使用方法的介绍。 使用iframe预览pdf 如果后端返回的不是url,那么需要使用 responseType = \\\'blob\\\' 来读取后端传来的内容。 扩展: 同样是使用iframe进行预览,如果有 其他格式 如word/xls/ppt/txt的文件需要预览,可以使用微软解

    2024年02月09日
    浏览(42)
  • Vue3 - props

    props 用于接收父组件传递的值 在使用 script setup 的单文件组件中,props 可以使用 defineProps() 宏来声明: 在没有使用 script setup 的组件中,prop 可以使用 props 选项来声明(和vue2一致): 传递给 defineProps() 的参数和提供给 props 选项的值是相同的,两种声明方式背后其实使用的都

    2024年02月05日
    浏览(63)
  • 【vue3】vue3接收props以及emit的用法

    技术 :vue3.2.40 UI框架 :arco-design 2.44.7 css技术 :less 4.1.3 实现 :子组件接收props以及通过emit方法传值父组件 vue3使用的组合式API,我这里使用的是defineComponent 1.setup里如果需要接收props和使用emit,只需要带参数 setup(props, { emit }) 2.setup里面只需要带emit(‘handleCancel’),不需要带

    2024年02月15日
    浏览(26)
  • 前端学习---vue2--选项/数据--data-computed-watch-methods-props

    写在前面: vue提供了很多数据相关的。 简单的说就是进行双向绑定的区域。 vue实例的数据对象,会把data的数据转换成getter和setter,从而可以进行响应式的变化, vue实例创建后,可以通过vm.$data.x获取data里面的x,但同时vue实例也代理了其中的对象,所以我们一般使用简单的

    2024年02月14日
    浏览(33)
  • vue3 监听props 的变化

    再三说明 仅仅个人学习用,不误导别人 我觉得props 会创建对应的属性,去接受这些值,比如传递一个ref的基本值 age props.age = age.value 传递一个ref的引用值 person props.person= person.value 传递一个reactive的引用值 person props.person= person 最开始时候,props指向了一个响应式的reactive pe

    2024年02月11日
    浏览(28)
  • Vue3 props的使用详解

    Props 声明 1、字符串数组声明props  2.对象实现props 你还可以使用类型标注,这是ts的特性。 3、使用camelCase(小驼峰命名法),可以在模板中直接使用(如第一个例子)。看代码 4、动态绑定props 注意事项:defineprops在之前的Vue版本中需要引入,但是现在是不需要了。上面几个例子

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包