[英]In Vue, can I transfer props?
想象一下,我有一个<progress-bar>
UI 组件,我想创建一个<app-progress-bar>
组件,它与<progress-bar>
相同,但有一些样式调整。
AppProgressBar.vue:
<template> <progress-bar class="app-progress-bar"></progress-bar> </template>
这会中断,因为<progress-bar>
需要percent
属性。 所以我可以把它传入:
<progress-bar class="app-progress-bar" percent="percent"></progress-bar>
这看起来很好,但是当<progress-bar>
有很多道具时很脆弱。 我可以简单地通过所有道具吗? 理论语法:
<progress-bar class="app-progress-bar" {...props}></progress-bar>
这类似于 React/JSX。
就像已经回答的那样,扩展组件将是在这种情况下创建组件的好方法。 类似于其他语言中的类继承。
但是,您也可以将对象作为道具传递。 如果你想保持干净,不想扩展你的组件,你可以像这样传递一个 prop:
//object with many values that you need to pass. for ex.
myObjectWithSuff: { percent: 10%, someOtherStuff: value, ... }
<progress-bar class="app-progress-bar" myProp="myObjectWithStuff"></progress-bar>
在progress-bar
组件中,声明道具myProp
。 然后您可以访问该对象的任何属性。 例如: this.myProp.percent
。
这既快速又简单,但根据您的架构,扩展组件可能是可行的方法。
经过研究,我认为这是不可能的。 相反,您可以extend
一个组件并在data
或computed
上放置一个extraClass
键:
import ProgressBar from './ProgressBar'
export default {
extends: ProgressBar,
data() {
return { extraClass: 'app-progress-bar' }
}
}
进度条.vue:
<template>
<div class="progress-bar" :class="extraClass">...</div>
</template>
这不像 React 那样干净或灵活,但它确实有效。
抽象的
这可以通过将 $attrs 绑定到孩子来完成。 因此,在您的情况下,它将是:
<template>
<progress-bar v-bind="$attrs" class="app-progress-bar"></progress-bar>
</template>
链接到文档
vm.$attrs:包含父范围属性绑定(类和样式除外)...并且可以向下传递给内部组件
来源: Vue $attrs 文档
例子
假设一个名为<inner>
的组件有一个名为dark
的布尔属性和一个名为color
的字符串属性。
现在让我们定义一个名为<outer>
的外部组件,它在其定义中包装了<inner>
。
<template>
<inner></inner>
</template>
.
.
.
name: 'outer'
这里的问题是,如果我们使用<outer>
组件,我们无法将深色和彩色道具传递给知道如何处理它们的<inner>
组件。 例如<inner dark color="blue"></inner>
有效,但<outer dark color="blue"></outer>
无效。
如果您更改<outer>
的定义以包含$attrs
绑定,它将为您传输所有道具(这不包括style
和class
)。 这是新定义:
<template>
<inner v-bind="$attrs"></inner>
</template>
.
.
.
name: 'outer'
现在您可以使用<outer dark color="blue"></outer>
了。
附加说明
您还可以默认使用inheritAttrs
来防止这种行为。 你可以在这里查看官方的 Vue 文档,我还发现了这个 JSFiddle ,它给出了一个使用inheritAttrs
的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.