Vue.js 如何在插槽上使用属性
Vue.js how to use attributes on slots
是否可以在插槽上设置属性并且来自 parent 的元素获得这些属性?
Parent
<vDropdown>
<button slot="button">new button</button>
<ul>content</ul>
</vDropdown>
Dropdown.vue
<div>
<slot name="button" aria-haspopup="true">
//fallback
<button aria-haspopup="true">Default Button</button>
</slot>
<div id="name" :aria-expanded="expanded">
<slot />
</div>
</div>
按钮的输出没有任何属性...
<div>
<button>new button</button>
<div id="myDropdown" aria-expanded="false">
<ul>content</ul>
</div>
</div>
步骤 1. 在父级中,将旧的 deprecated 广告位定位语法 slot="button"
更新为 v-slot
指令:
Parent.vue
...
<template v-slot:button> ✅
<button>new button</button>
</template>
...
<button slot="button">new button</button> ❌
如何在 Vue 2.6.0+
中定位插槽
第 2 步。 接下来,了解您添加到 <slot>
标记的任何属性绑定都将可用于放置在那里的任何插槽内容(这些称为“插槽”道具"):
Dropdown.vue
<slot name="button" :aria-haspopup="true">
步骤 3. Vue 自动创建一个对象,其中包含步骤 2 中的每个绑定,并将其传递给 v-slot
表达式,即下面的 slotProps
。然后,您可以使用特殊的 v-bind=""
语法将所有这些绑定分布到按钮上:
Parent.vue 已更新
<template v-slot:button="slotProps">
<button v-bind="slotProps">new button</button>
</template>
这是一个演示,但遗憾的是,当您使用 kebab-case 属性执行此操作时,它需要使用两个连字符进行破解。我计划在 Vue GitHub 存储库中为此提交一个问题。
Vue.component('dropdown', {
template: `
<div>
<slot name="button" aria--haspopup="true">
<button aria-haspopup="true">Default Button</button>
</slot>
<div id="name" :aria-expanded="expanded">
<slot />
</div>
</div>`,
data() {
return {
expanded: true
}
}
});
new Vue({
el: "#app",
});
.aria-haspopup {
background: orange;
}
<div id="app">
<dropdown>
<template v-slot:button="slotProps">
<button v-bind="slotProps">new button</button>
</template>
<ul>content</ul>
</dropdown>
</div>
<script src="https://unpkg.com/vue"></script>
是否可以在插槽上设置属性并且来自 parent 的元素获得这些属性?
Parent
<vDropdown>
<button slot="button">new button</button>
<ul>content</ul>
</vDropdown>
Dropdown.vue
<div>
<slot name="button" aria-haspopup="true">
//fallback
<button aria-haspopup="true">Default Button</button>
</slot>
<div id="name" :aria-expanded="expanded">
<slot />
</div>
</div>
按钮的输出没有任何属性...
<div>
<button>new button</button>
<div id="myDropdown" aria-expanded="false">
<ul>content</ul>
</div>
</div>
步骤 1. 在父级中,将旧的 deprecated 广告位定位语法 slot="button"
更新为 v-slot
指令:
Parent.vue
...
<template v-slot:button> ✅
<button>new button</button>
</template>
...
<button slot="button">new button</button> ❌
如何在 Vue 2.6.0+
中定位插槽第 2 步。 接下来,了解您添加到 <slot>
标记的任何属性绑定都将可用于放置在那里的任何插槽内容(这些称为“插槽”道具"):
Dropdown.vue
<slot name="button" :aria-haspopup="true">
步骤 3. Vue 自动创建一个对象,其中包含步骤 2 中的每个绑定,并将其传递给 v-slot
表达式,即下面的 slotProps
。然后,您可以使用特殊的 v-bind=""
语法将所有这些绑定分布到按钮上:
Parent.vue 已更新
<template v-slot:button="slotProps">
<button v-bind="slotProps">new button</button>
</template>
这是一个演示,但遗憾的是,当您使用 kebab-case 属性执行此操作时,它需要使用两个连字符进行破解。我计划在 Vue GitHub 存储库中为此提交一个问题。
Vue.component('dropdown', {
template: `
<div>
<slot name="button" aria--haspopup="true">
<button aria-haspopup="true">Default Button</button>
</slot>
<div id="name" :aria-expanded="expanded">
<slot />
</div>
</div>`,
data() {
return {
expanded: true
}
}
});
new Vue({
el: "#app",
});
.aria-haspopup {
background: orange;
}
<div id="app">
<dropdown>
<template v-slot:button="slotProps">
<button v-bind="slotProps">new button</button>
</template>
<ul>content</ul>
</dropdown>
</div>
<script src="https://unpkg.com/vue"></script>