【发布时间】:2020-10-01 20:15:07
【问题描述】:
在我们的项目中,我们有一个列表组件,它呈现一组项目的列表,其中一个可以一次编辑。它使用插槽来获取要为每个项目呈现的内容。简化,看起来有点像这样:
<template>
<div>
<div v-for="item in items">
<slot name="display" :item="item" v-if="!editing(item)"></slot>
<slot name="edit" :item="item" v-else></slot>
</div>
<button @click="clickDone">Done</button>
</div>
<template>
<script>
export default {
props: ["items"],
methods: {
clickDone() {
...
}
}
}
这用于需要显示复杂对象的可编辑列表的另一个组件。看起来有点像这样:
<EditableList :items="listOfComplexObjects">
<template #edit="item">
<component :is="item.componentType" v-model="item" />
</template>
</EditableList>
然后可以为列表中的每个项目呈现许多不同的组件,具体取决于它的类型。
在第一个代码 sn-p 中,您可以看到“完成”按钮。此按钮是列表用来将“可编辑”项目转换为“显示”项目的按钮。我们遇到的问题是我们想在单击此按钮时调用验证。但是,每个项目类型组件的验证都会有所不同。此外,验证需要将项目类型组件中的某些字段标记为无效并在其上显示错误消息。所以这个验证在项目类型组件中最有意义。所以我们正在尝试考虑如何在“完成”按钮上调用插槽内组件上的验证方法。
我们的考虑:
通过在“组件”上使用 ref,我们可以使用
this.$parent.refs.refName.validate之类的东西从可编辑列表中调用验证器。这样做的问题是它破坏了可编辑列表、父组件和列表项组件之间的封装。将“完成”按钮移动到列表项组件中。单击完成按钮将调用本地验证,然后发出一个事件,父组件将传递给可编辑列表以操纵其内部状态。这个解决方案是我们目前最好的解决方案,但感觉像是在不可编辑的列表组件中添加了不必要的样板代码。
我们希望我们能做什么:
- 让每个列表项组件实现一个验证方法,父组件将其作为一种特定于每个项的“插槽”或道具传递到可编辑列表中。然后可编辑列表可以在单击完成时调用该验证方法,并且列表项组件可以使用错误消息更新其状态。
如何在 Vue.js 中最轻松正确地实现上述目标?
【问题讨论】:
-
如果验证失败,您是否希望能够取消转换表单编辑以显示?
-
@Janos 是的,我想要一个像“if (validation) { ... }”这样的条件,其中 ... 是从“编辑”模式更改为“显示”模式的代码
标签: vue.js vue-component