属性,通常简称为“props”,是 Vue 的重要组成部分,也是我们将数据传递给子组件的关键方式。在本指南中,我们将讨论如何使用道具,以及我们为什么使用它们。本指南的重点是Vue 3,尽管所写的大部分内容也适用于 Vue 2。
Vue 中的属性或道具#
在构建许多前端框架(如 Vue)时,我们使用的基本原则之一是,新功能通常构建为组件。例如,我们可以构建一个“最流行”的组件,它看起来像这样:
<MostPopular results="10" />
大概,上面的组件创建了一个最受欢迎的帖子列表,然后只显示前 10 个。因此,我们可以保持 HTML 的自然架构,但构建更复杂的自定义 HTML 标签以在我们的设计中使用。
在上面的例子中,results
是一个 prop。在上面的示例中,我们将数据传递给MostPopular
组件 – 该数据是数字 10。然后组件可以使用此信息以某种方式显示数据。
然而,Vue 中的道具可能比这复杂得多。下面我们来看看如何定义props。
Vue中如何定义props#
当我们创建一个新组件时,我们可以在 Javascript中为该组件创建 props 。例如,在下面,我们创建一个名为“MostPopular”的道具和一个名为“results”的道具。
export default {
name: "MostPopular",
props: [ 'results' ],
created() {
// When the component is used/created, do something
}
}
在 Vue 中强制执行 prop 类型
我们可以通过定义类型和道具名称来强制道具的类型。例如,下面的示例将“结果”道具强制为数字。
export default {
name: "MostPopular",
props: {
results: Number
},
created() {
// When the component is used/created, do something
}
}
查看道具类型
道具不仅限于String
s 或Number
s。还允许以下类型:
Object
sArray
sSymbol
sFunction
sNumber
sString
sDate
sBoolean
s
我们也可以有自定义类型——可以在 Vue 中使用Class
布尔类型
如果我们将 prop 的类型设置为 Boolean,那么只需编写该 prop 的名称就会自动将其设置为 true。省略该道具会将其设置为错误。例如,下面的 HTML 相当于添加了 prop :enabled="true"
。
<MostPopular enabled />
在 Vue 中为 prop 添加更多属性
如果我们想更进一步,我们可以设置一个 prop required,或者给它一个默认值。为此,我们可以将我们的道具定义为一个对象。下面的代码现在使我们的results
prop 成为必需,并给它一个默认值 8。
export default {
name: "MostPopular",
props: {
results: {
type: Number,
required: true,
default: 8
}
},
created() {
// When the component is used/created, do something
}
}
在 Vue 中使用道具#
现在我们已经介绍了基础知识,让我们看看我们如何使用道具。在最基本的层面上,我们可以添加一个只有文本或内容的道具,如下所示:
<MostPopular results="20" />
但是,我们也可以传递数据或计算值。假设我们在 Vue Javascript 中存储一些数据,如下所示:
export default {
name: "HomePage",
data() {
return {
popularData: [{
name: "My First Post",
views: 23453,
url: '/my-first-post'
},
{
name: "My second post!",
views: 2395392,
url: '/my-second-post'
}]
}
}
}
假设我们现在想popularData
通过一个名为data
. 这可以通过在 prop 之前使用v-bind:
,或者:
在 Vue 3 中简称为 来实现。下面的示例现在设置results
为 10,并设置data
为我们数据函数中 mostPopular 的值。
<MostPopular results="20" :data="popularData"/>
这样做的好处是应该popularData
改变,我们可以在我们的MostPopular
组件中观察这种变化,并在我们认为合适的时候更新数据。
在 Vue 中将对象绑定为属性#
由于想要将一段数据作为一组 props 传递给子组件的情况并不少见,我们可以使用v-bind
. 让我们看一个例子,我们的父组件中有一组数据:
export default {
name: "HomePage",
data() {
return {
popularData: {
name: 'Guide Document',
ranking: 15,
url: '/guide-document'
}
}
}
}
我们可以通过简单地执行以下操作将所有属性绑定popularData
到我们的组件:
<MostPopular v-bind="popularData" />
翻译成..
<MostPopular :name="popularData.name" :ranking="popularData.ranking" :url="popularData.url" />
Vue 中的变异道具#
在 Vue 中修改 props 是不好的做法,因为在架构上 props 是单向数据系统的一部分。这意味着数据是从父级传递给子级的,而不是相反。因此,道具是只读的。如果你想更新一个 prop 值,你可以把它存储在你的data()
函数中,然后改变数据变量。
export default {
name: "MostPopular",
data() {
return {
resultsData: 10
}
},
props: {
results: Number
}
created() {
// Set our data 'resultsData' to the value of our prop, results
// Note that props and data are both exposed on 'this'
this.resultsData = this.results;
// We can then mutate our data, rather than our prop.
this.resultsData = 15;
}
}
在 Vue 中验证道具值#
如果我们想在 Vue 中验证一个 prop 的值,我们可以使用一个validator
函数。这让我们可以检查属性是否符合我们期望的值。例如,假设我们期望结果为 5 或 10 – 我们可以使用验证器函数检查这一点,如下所示:
export default {
name: "MostPopular",
data() {
return {
resultsData: 10
}
},
props: {
results: {
validator(value) {
if(value === 5 || value === 10) {
return true;
}
else {
return false;
}
}
}
}
}
在 Composition API 中定义 Vue 道具#
从 Vue 3 开始,我们还可以在 Vue 中考虑组合 API。如果您在组合 API 中定义道具,则必须使用该defineProps
函数。幸运的是,它遵循与我们之前所做的一切相同的语法。例如,如果我们要创建一个名为的 prop name
,其默认值为“my-prop”,类型为String
,它看起来像这样:
<script setup>
import { defineProps } from 'vue';
const props = defineProps({
name: {
type: String,
default: "there"
}
});
结论#
我希望你喜欢这篇文章。如果您是 Vue 的新手,请不要忘记查看我们关于如何创建您的第一个应用程序的文章。否则,请继续订阅以获取更多信息。