【问题标题】:Vuejs generating click event in next button after pressing enter input按下回车输入后,Vuejs在下一个按钮中生成点击事件
【发布时间】:2021-01-22 11:37:11
【问题描述】:

我遇到了一个很奇怪的案例。

我已经构建了一个非常简单的示例来展示我的问题。

我有 3 个文件:App.vue、todo2.vue、todoI.vue。 App.vue 有 1 个组件(todo2.vue)。 todo2.vue 有 1 个组件 (todoI.vue)。

你会在todo2和todoI的代码下找到。

我面临的问题是,当我在输入文本 id #checkboxAdd 中按下回车键时,它会在下一个按钮上触发一个事件。

在下面的代码中,当在输入文本#checkboxAdd 中按下回车键时,它会在我的 todoI 按钮的第一次迭代中触发 click 事件,在我的示例中调用函数 del (@click="del()"),它是 console.log(this) ,记录组件 todoI 的第一次迭代。

更奇怪的是,当我在输入文本之后添加一个按钮时,给console.log添加一个@click事件,它确实被调用了(而不是调用todoI第一次迭代的按钮)。

有人明白为什么会这样吗?这是我做错了吗?

todo2.vue

<template>
    <div class="d-flex flex-column">
        <div>
            <form @submit.prevent="">
                <div class="mb-3 input-group">
                    <div class="input-group-text">
                        <input type="checkbox" class="form-check-input" id="checkboxAdd" aria-describedby="checkboxAdd">
                    </div>
                    <input type="text" class="form-control" id="inputAdd" aria-describedby="inputAdd" v-model="tempI">
                </div>
                <ul class="list-group">
                    <todoI v-for="(it, k) in todos" v-model="it.v" :key="k" @delItem="del(it)"></todoI>
                </ul>
                <br>
            </form>
        </div>
    </div>
</template>

<script>

import todoI from './todoI.vue'

export default {
    name:"todo2",
    components: {todoI},
    data: function(){
        return {
            todos: [
                {v:{
                    val: "Bread",
                    checked: false
                }},
                {v:{
                    val: "Fruits",
                    checked: false
                }},
                {v:{
                    val: "Ironing",
                    checked: false
                }}
            ],
            tempI: ''
        }
    },
    methods:{
        del (it){
            this.todos = this.todos.filter(i => i!==it)
        }
    }
}
</script>

todoI.vue

<template>
    <li class="list-group-item d-flex align-items-center" @mouseover="btnShow=true" @mouseleave="btnShow=false">
        <input type="checkbox" class="me-4" v-model="value.checked">
        <div class="w-100" :class="value.checked ? checkedClass : '' ">{{ value.val }}</div>
        <div class="flex-shrink-1">
            <button class="btn btn-sm btn-close" v-show="btnShow" @click="del()"></button> 
        </div>
    </li>
</template>

<script>
export default {
    name:"todoI",
    props:{
        value: Object
    },
    data: function(){
        return {
            checkedClass:['text-decoration-line-through', 'text-muted'],
            btnShow: false,
        }
    },
    methods:{
        del(){
            console.log(this)
        }
    }
}
</script>

【问题讨论】:

    标签: javascript html css vue.js vuejs2


    【解决方案1】:

    你可以简单地使用@keypress 或@keydown

    <input type="text" class="form-control" id="inputAdd" v-model="tempI" @keypress.enter.prevent />
    

    <input type="text" class="form-control" id="inputAdd" v-model="tempI" @keydown.enter.prevent = "">
    

    【讨论】:

    • 确实通过 keydown 或 keypress 交换 keyup 可以防止这种行为。意思是按下时触发点击。但是你知道为什么会这样吗?
    • 原因是在填写表格时,在文本框中按回车应该提交表格。这称为隐式表单提交。尽管对于辅助技术和重要的用户便利性至关重要,但许多 Web 表单出于某种原因阻止它
    • 我怀疑问题来自正在提交的表单,因为表单已经包含提及@submit.prevent=""
    • 无论如何,如果您的问题得到解决,请考虑接受并支持我的解决方案。谢谢:)
    • 我的问题不是要找到一种方法来使这段代码工作,我已经有了另一种方法,我的问题是关于理解可以解释为什么会发生这种情况的过程,以便更好地理解 Vuejs。提醒一下,问题是“有人知道为什么会发生这种情况吗?”,从您的回答中我知道您不知道,这就是为什么我现在不接受您的回答(但确实赞成)的原因。一旦给出解释,我将很乐意接受一个答案(如您的编辑)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2020-02-25
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多