【发布时间】:2020-07-04 23:48:21
【问题描述】:
希望这里有人能够帮助我解决这个问题。
我有以下数据:
[
{
title: 'Header',
children: [
{
title: 'Paragraph',
children: [],
},
],
},
{
title: 'Container',
children: [
{
title: 'Paragraph',
children: [],
},
],
},
]
我想在<div> 列表中呈现它,如下所示:
<div class="sortable-item" data-depth="1" data-index="0">Header</div> <!-- Parent -->
<div class="sortable-item" data-depth="2" data-index="0">Paragraph</div> <!-- Child-->
<div class="sortable-item" data-depth="1" data-index="1">Container</div> <!-- Parent -->
<div class="sortable-item" data-depth="2" data-index="0">Paragraph</div> <!-- Child-->
我已经构建了一个递归组件,这就是我目前所拥有的:
<template>
<template v-for="(item, index) in tree">
<div
class="sortable-item"
:data-depth="getDepth()"
:data-index="index"
:key="getKey(index)"
>
{{ item.title }}
</div>
<Multi-Level-Sortable
:tree="item.children"
:parent-depth="getDepth()"
:parent-index="index"
:key="getKey(index + 0.5)"
></Multi-Level-Sortable>
</template>
</template>
<script>
export default {
name: 'MultiLevelSortable',
props: {
tree: {
type: Array,
default() {
return [];
},
},
parentDepth: {
type: Number,
},
parentIndex: {
type: Number,
},
},
methods: {
getDepth() {
return typeof this.parentDepth !== 'undefined' ? this.parentDepth + 1 : 1;
},
getKey(index) {
return typeof this.parentIndex !== 'undefined' ? `${this.parentIndex}.${index}` : `${index}`;
},
},
};
</script>
正如你所见,我不仅有一个 <template> 作为根元素,我还有一个 v-for,Vue.js 的两个“不”。我该如何解决这个问题以呈现我上面指出的元素列表?
注意:我已经尝试过vue-fragment 并且能够实现我想要的结构,但是当我尝试使用Sortable.js 时它不起作用,好像它不会识别任何.sortable-item 元素。
任何帮助将不胜感激!谢谢!
【问题讨论】:
-
有什么理由不能将元素列表包装在
<div>中吗?顺便说一句,在 Vue 3 中,这个限制正在消失。此外,AFAIK 组件中不能有多个模板标签... -
@AlexMA 我不想将它们包裹在
<div>中的原因是因为我希望孩子们直接跟随父母等等。让我看看你建议的链接。 -
那么我很确定在 Vue 3 之前唯一的方法就是使用功能组件。请参阅链接答案。
-
codepen.io/AlgeoMA/pen/bGdmRdQ 如果你想玩它。
-
@AlexMA 感谢您进行快速测试。如果这对我的问题有帮助,我会告诉你的。谢谢!
标签: javascript vue.js