使用vue过程中出现的问题

del删除上一行的时候,下一行如果有内容会自动展开,为什么,大家帮忙解决一下,感谢!!!

以下是全部的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>树形视图扩展</title>
    <style>
        body {
            font-family: Menlo, Consolas, monospace;
            color: #444;
        }

        .item {
            cursor: pointer;
        }

        .bold {
            font-weight: bold;
        }

        ul {
            padding-left: 1em;
            line-height: 1.5em;
            list-style-type: dot;
        }
    </style>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<script type="text/x-template" id="item-template">
    <li>
        <div :class="{bold: isFolder}" @click="toggle" @dblclick="changeType">
            {{ model.name }}
            <span v-if="isFolder">[{{ open ? '-' : '+' }}]</span>
            <span class="bold" @click="$emit('del', index)">[del]</span>
        </div>
        <ul v-if="isFolder" v-show="open">
            <item class="item" v-for="(item, index) in model.children" :key="index" :index="index" :model="item" @del="model.children.splice($event, 1)"></item>
            <li class="add" @click="addChild">+</li>
        </ul>
    </li>
</script>

<p>树形结构</p>

<ul id="demo">
    <item class="item" v-for="(model, index) in treeData" :key="index" :index="index" :model="model" @del="treeData.splice($event, 1)"></item>
</ul>

<script>
    var data = [
        {name: 'han'},
        {name: 'wang'},
        {
            name: 'liu',
            children: [
                {name: 'zhang'},
                {name: 'lu'}
            ]
        }
    ];

    Vue.component('item', {
        template: '#item-template',
        props: {
            model: Object,
            index: Number
        },
        data: function () {
            return {
                open: false
            }
        },
        computed: {
            isFolder: function () {
                return this.model.children && this.model.children.length;
            }
        },
        methods: {
            toggle: function () {
                if (this.isFolder) {
                    this.open = !this.open;
                }
            },
            changeType: function () {
                if (!this.isFolder) {
                    Vue.set(this.model, 'children', []);
                    this.addChild();
                    this.open = true;
                }
            },
            addChild: function () {
                this.model.children.push({
                    name: 'new child'
                });
            }
        }
    });
    var demo = new Vue({
        el: '#demo',
        data: {
            treeData: data
        }
    });
</script>
</body>
</html>
阅读 1.6k
1 个回答

首先,你这里的 item key 用的是数组下标,导致了一个问题,删除第二的时候,原第三个的下标变成了2,导致了 click del 操作 引发了toggle 事件,切换了 open 状态。
两个方法解决这个问题:1. 给 @click="$emit('del', index)" 加 .stop 阻止冒泡;

                2. 修改 key 值,保证不会出现长度修改导致的 复用, :key="index + model.name"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题