use*_*584 11 javascript vue.js vue-component vuejs2 vuejs3
我正在将 vue 2 应用程序迁移到 vue 3。在官方文档中,提到 $listeners 对象已在 Vue 3 中删除。事件监听器现在是 $attrs 的一部分。它也采用非 prop 属性(类、样式)。在我的 vue 2 应用程序中,有一个图标按钮自定义组件,如下所示。
图标组件:
<template>
<vu-button v-bind="buttonProps"
:class="buttonClass"
v-on="$listeners"
@click="buttonToggle">
<vu-icon v-bind="iconProps"><slot/></vu-icon>
</vu-button>
</template>
Run Code Online (Sandbox Code Playgroud)
它用于各种其他组件。
父组件 1:
<vu-icon-button id="sw1" medium style="left:200px;">home</vu-icon-button>
Run Code Online (Sandbox Code Playgroud)
父组件2:
<vu-icon-button class="menu-detail-btn" icon="collapse_menu" icon-type="su" @click="openModal()" size="small"></vu-icon-button>
Run Code Online (Sandbox Code Playgroud)
至于迁移策略,我删除了 $listeners 但不确定那些非 prop 属性和 v-bind 标记。如何修改它们以便可以在具有属性的父组件中使用?
<script setup>
您可以使用API访问组件的 Fallthrough 属性useAttrs()
:
<script setup>
import { useAttrs } from 'vue'
const attrs = useAttrs()
</script>
Run Code Online (Sandbox Code Playgroud)
如果不使用<script setup>
, attrs 将作为上下文的属性公开setup()
:
export default {
setup(props, ctx) {
// fallthrough attributes are exposed as ctx.attrs
console.log(ctx.attrs)
}
}
Run Code Online (Sandbox Code Playgroud)
如果不希望组件自动继承属性,可以inheritAttrs: false
在组件的选项中进行设置。
如果使用<script setup>
,您将需要使用单独的普通<script>
块来声明此选项:
<script>
// use normal <script> to declare options
export default {
inheritAttrs: false
}
</script>
<script setup>
// ...setup logic
</script>
Run Code Online (Sandbox Code Playgroud)
您现在可以$attrs
直接在模板中使用该对象。当您想要将属性绑定到您选择的非根元素(而不是由根元素继承属性的自动行为)时,这非常有用。
例子:
<header>...</header>
<main v-bind="$attrs">...</main>
<footer>...</footer>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12798 次 |
最近记录: |