转义键在 vuejs 中不适用于第二个模态窗口

发布时间:2021-02-25 06:33

我有一个包含多行的表格,每行都有一个按钮,单击该按钮时,会打开一个包含表单元素的模式窗口。

提交表单后,第二个窗口打开以供确认,第一个窗口关闭。

下面的代码是我的示例工作流程。

我的问题是

按 Escape 键,在打开第一个窗口时有效,但在打开第二个窗口时无法关闭。

<template>
    <div>
        <table>
            <tr>
                <td>
                    <button @click="openFormWindow">Open form</button>
                </td>
            </tr>
        </table>
        <modal v-on-escape="hideFirstModal" v-if="isFirstWindowOpen">
            <div>
                <form @submit="submitFormOne">
                    <input type="text">
                    <button type="submit"></button>
                </form>
            </div>
        </modal>
        <modal v-on-escape="hideSecondModal" v-if="isSecondWindowOpen">
            <p>confirmation window</p>
        </modal>
    </div>
</template>

<script>
export default {
    data () {
        return {
            isFirstWindowOpen: false,
            isSecondWindowOpen: false
        }
    }
    methods: {
        openFormWindow () {
            // form window opens 
            this.isFirstWindowOpen = true
        },
        hideFirstModal () {
            this.isFirstWindowOpen = false
        },
        hideSecondModal () {
            this.isSecondWindowOpen = false
        },
        submitFormOne () {
            // submit the details, let the first window close & open the second window.
            this.isFirstWindowOpen = false
            this.isSecondWindowOpen = true
        }
    }
}
</script>

vue 指令 on-escape

Vue.directive('on-escape', {
    bind (el, binding, vnode) {
        el.customEventKeydown = function (event) {
            // Check if click was outside the el and his childrens
            if (event.keyCode === 27) {
                vnode.context[binding.expression](event)
            }
        }
        document.body.addEventListener("keydown", el.customEventKeydown)
    },
    unbind (el) {
        document.body.removeEventListener("keydown", el.customEventKeydown)
    }
})
回答1

在每个 key 组件上使用 <modal> 告诉 Vue 不要重用 DOM 节点:

<modal v-on-escape="hideFirstModal" v-if="isFirstWindowOpen" key="modal1">
<modal v-on-escape="hideSecondModal" v-if="isSecondWindowOpen" key="modal2">

Vue 在创建第二个模式时为第一个模式重用 DOM,因此从未创建第二个 keydown 事件侦听器。

当在 DOM 中添加和删除元素时,Vue 有时会尝试通过重用旧的 DOM 节点来加速渲染。有时这会产生不必要的副作用。 key 实质上指示它不要这样做。

回答2

您似乎缺少 this.isSecondWindowOpen,它没有在您的数据函数中返回。