首页

文章

Vue组件中prop属性使用说明实例代码详解

发布网友 发布时间:2022-03-27 14:49

我来回答

1个回答

热心网友 时间:2022-03-27 16:18

Prop
的大小写
(camelCase
vs
kebab-case)
HTML
中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用
DOM
中的模板时,camelCase
(驼峰命名法)

prop
名需要使用其等价的
kebab-case
(短横线分隔命名)
命名:
Vue.component('blog-post',
{
//

JavaScript
中是
camelCase

props:
['postTitle'],
template:
'<h3>{{
postTitle
}}</h3>'
})
<!--

HTML
中是
kebab-case

-->
<blog-post
post-title="hello!"></blog-post>
重申一次,如果你使用字符串模板,那么这个*就不存在了。
静态的和动态的
Prop
像这样,你已经知道了可以像这样给
prop
传入一个静态的值:
<blog-post
title="My
journey
with
Vue"></blog-post>
你也知道
prop
可以通过
v-bind
动态赋值,例如:
<blog-post
v-bind:title="post.title"></blog-post>
在上述两个示例中,我们传入的值都是字符串类型的,但实际上任何类型的值都可以传给一个
prop。
传入一个数字
<!--
即便
`42`
是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:likes="42"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:likes="post.likes"></blog-post>
传入一个布尔值
<!--
包含该
prop
没有值的情况在内,都意味着
`true`。-->
<blog-post
favorited></blog-post>
<!--
即便
`false`
是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<base-input
v-bind:favorited="false">
<!--
用一个变量进行动态赋值。-->
<base-input
v-bind:favorited="post.currentUserFavorited">
传入一个数组
<!--
即便数组是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:comment-ids="[234,
266,
273]"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:comment-ids="post.commentIds"></blog-post>
传入一个对象
<!--
即便对象是静态的,我们仍然需要
`v-bind`
来告诉
Vue
-->
<!--
这是一个
JavaScript
表达式而不是一个字符串。-->
<blog-post
v-bind:comments="{
id:
1,
title:
'My
Journey
with
Vue'
}"></blog-post>
<!--
用一个变量进行动态赋值。-->
<blog-post
v-bind:post="post"></blog-post>
传入一个对象的所有属性
如果你想要将一个对象的所有属性都作为
prop
传入,你可以使用不带参数的
v-bind
(取代
v-bind:prop-name)。例如,对于一个给定的对象
post:
post:
{
id:
1,
title:
'My
Journey
with
Vue'
}
下面的模板:
<blog-post
v-bind="post"></blog-post>
等价于:
<blog-post
v-bind:id="post.id"
v-bind:title="post.title"
></blog-post>
Vue的组件中的props属性单向数据流
所有的
prop都使得其父子prop之间形成了一个单向下行绑定:父级
prop
的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中所有的
prop
都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变
prop。如果你这样做了,Vue
会在浏览器的控制台中发出警告。
这里有两种常见的试图改变一个
prop
的情形:
这个
prop
用来传递一个初始值;这个子组件接下来希望将其作为一个本地的
prop
数据来使用。在这种情况下,最好定义一个本地的
data
属性并将这个
prop
用作其初始值:
props:
['initialCounter'],
data:
function
()
{
return
{
counter:
this.initialCounter
}
}
这个
prop
以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个
prop
的值来定义一个计算属性:
props:
['size'],
computed:
{
normalizedSize:
function
()
{
return
this.size.trim().toLowerCase()
}
}
注意在
JavaScript
中对象和数组是通过引用传入的,所以对于一个数组或对象类型的
prop
来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。
Prop
验证
我们可以为组件的
prop
指定需求。如果有一个需求没有被满足,则
Vue
会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。
为了定制
prop
的验证方式,你可以为
props
中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:
Vue.component('my-component',
{
props:
{
//
基础的类型检查
(`null`
匹配任何类型)
propA:
Number,
//
多个可能的类型
propB:
[String,
Number],
//
必填的字符串
propC:
{
type:
String,
required:
true
},
//
带有默认值的数字
propD:
{
type:
Number,
default:
100
},
//
带有默认值的对象
propE:
{
type:
Object,
//
对象或数组且一定会从一个工厂函数返回默认值
default:
function
()
{
return
{
message:
'hello'
}
}
},
//
自定义验证函数
propF:
{
validator:
function
(value)
{
//
这个值必须匹配下列字符串中的一个
return
['success',
'warning',
'danger'].indexOf(value)
!==
-1
}
}
}
})

prop
验证失败的时候,(开发环境构建版本的)
Vue
将会产生一个控制台的警告。
注意那些
prop
会在一个组件实例创建之前进行验证,所以实例的属性
(如
data、computed
等)

default

validator
函数中是不可用的。
类型检查
type
可以是下列原生构造函数中的一个:
String
Number
Boolean
Function
Object
Array
Symbol
额外的,type
还可以是一个自定义的构造函数,并且通过
instanceof
来进行检查确认。例如,给定下列现成的构造函数:
function
Person
(firstName,
lastName)
{
this.firstName
=
firstName
this.lastName
=
lastName
}
你可以使用:
Vue.component('blog-post',
{
props:
{
author:
Person
}
})
来验证
author
prop
的值是否是通过
new
Person
创建的。

Prop
的特性
一个非
prop
特性是指传向一个组件,但是该组件并没有相应
prop
定义的特性。
因为显式定义的
prop
适用于向一个子组件传入信息,然而组件库的作者并不总能预见组件会被用于怎样的场景。这也是为什么组件可以接受任意的特性,而这些特性会被添加到这个组件的根元素上。
例如,想象一下你通过一个
Bootstrap
插件使用了一个第三方的
组件,这个插件需要在其
上用到一个
data-date-picker
特性。我们可以将这个特性添加到你的组件实例上:
<bootstrap-date-input
data-date-picker="activated"></bootstrap-date-input>
然后这个
data-date-picker=”activated”
特性就会自动添加到<bootstrap-date-input>
的根元素上。
替换/合并已有的特性
想象一下
<bootstrap-date-input>
的模板是这样的:
<input
type="date"
class="form-control">
为了给我们的日期选择器插件定制一个主题,我们可能需要像这样添加一个特别的类名:
<bootstrap-date-input
data-date-picker="activated"
class="date-picker-theme-dark"
></bootstrap-date-input>
在这种情况下,我们定义了两个不同的
class
的值:
form-control,这是在组件的模板内设置好的
date-picker-theme-dark,这是从组件的父级传入的
对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。所以如果传入
type=”text”
就会替换掉
type=”date”
并把它破坏!庆幸的是,class

style
特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:form-control
date-picker-theme-dark。
禁用特性继承
如果你不希望组件的根元素继承特性,你可以设置在组件的选项中设置
inheritAttrs:
false。例如:
Vue.component('my-component',
{
inheritAttrs:
false,
//
...
})
这尤其适合配合实例的
$attrs
属性使用,该属性包含了传递给一个组件的特性名和特性值,例如:
{
class:
'username-input',
placeholder:
'Enter
your
username'
}
有了
inheritAttrs:
false

$attrs,你就可以手动决定这些特性会被赋予哪个元素。在撰写基础组件的时候是常会用到的:
Vue.component('base-input',
{
inheritAttrs:
false,
props:
['label',
'value'],
template:
`
<label>
{{
label
}}
<input
v-bind="$attrs"
v-bind:value="value"
v-on:input="$emit('input',
$event.target.value)"
>
</label>
`
})
这个模式允许你在使用基础组件的时候更像是使用原始的
HTML
元素,而不会担心哪个元素是真正的根元素:
<base-input
v-model="username"
class="username-input"
placeholder="Enter
your
username"
></base-input>
总结
以上所述是小编给大家介绍的Vue组件中prop属性使用说明,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:VueJs组件prop验证简单介绍Vue组件选项props实例详解vue父组件通过props如何向子组件传递方法详解详解vue2父组件传递props异步数据到子组件的问题详解vue父子组件间传值(props)Vue2.0利用
v-model
实现组件props双向绑定的优美解决方案
贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 唐古拉山海拔唐古拉山海拔是多少 怎么看待取消跳广场舞的人的退休金 如何选购新鲜的蓝田水柿? 恭城水柿柿树作用 创维洗衣机使用教程 创维全自动洗衣机怎么使用 自动开门器 狗羊属相婚姻相配吗 3岁的小孩不会说话怎么办 3岁孩子不会说话,应该挂什么科? 3岁小孩不会说话正常吗 鹿茸炖乌鸡怎么做? 新型冠状肺炎吃什么药可以预防 冰箱上电后一直响 食品生产许可证编号开头为“ G”。 库存过期香精 怎么在命令提示符的标题栏显示系统当前时间和日期 易企秀标题与内容出现时间怎么修改 易语言程序怎样让标题显示时间 我的世界怎么调title的持续时间? Wordpress怎么设置标题描述日期时间格式 怎样使HTML中的title属性停留时间(显示时间)变长? 安卓手机有带微信短信来电的闪光灯软件吗 怎么修改安卓自带短信的APK让短信变成气泡 安卓手机怎么发那种弹窗式的短信?如图,是10086给发的!回答的好的加分! 三星s7发短信怎么带特效 Android怎么实现Iphone里面短信发送时那种气泡的动画效果 小米手机可以带效果发送短信满屏吗? 短信这个功能安卓机能接到特效吗 短信怎么满屏消息 安卓手机能短信带特效发送给苹果手机吗 短信怎么发特效 你好 OPPO发短信怎么设置特效? 安卓系统发短信有特效果 安卓手机来信息怎么设置闪光灯 什么是IE浏览器 佳能相机按拍摄键没反应是什么原因 手机拍照键点了没反应是为什么? 手机不能拍照,按拍照键没反应 我的苹果手机照相键怎么没反应啊? 荣耀50pro怎么拍运动中的人为什么在抓拍走动或是跑动中的人时,按拍摄键没有反应?只能拍静物吗?不_问一问 用单反相机拍照为什么有时拍照键按不下去? 爱奇艺手机号码手机如何解绑? 手机怎么解除爱奇艺绑定的手机号 怎样在手机上解除爱奇艺会员绑定的手机号 苹果6p为什么玩球球大作战没有声音 什么声音权限都设置了 手机看视频听音乐都有声就玩球球没声 球球大作战没声是怎么回事 苹果打开球球没有声音 “球球大作战”没声音是怎么回事?我打开了 但是没声音 我打开球球大作战以后,进去了游戏没有音乐,以前球球大作战都是有音乐的啊,为什么我这几次打开就是没有 球球大作战讲话没声音是怎么回事? “球球大作战”没声音是怎么回事? 球球大作战中我把音效开着的,为什么没有音效 我手机玩球球大作战为什么发语音总是没声音 球球大作战为什么没有声音 进入游戏没有声音怎么办 手机玩球球大作战为什么发语音总是没声音?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com