【问题标题】:Blur event cancels click event in Vue componentBlur 事件取消 Vue 组件中的点击事件
【发布时间】:2020-07-23 00:52:41
【问题描述】:

我在Vue.js 中有一个搜索组件。当您在文本输入中键入时,将从服务器获取搜索结果列表,然后显示在搜索字段下方的列表中。当您单击其中一个结果时,将触发 submit 事件。

但是,现在我尝试向文本输入添加一个模糊事件,当用户点击离开输入时,它应该隐藏结果列表。这工作正常,除了一种关键情况 - 点击结果不再触发 submit 事件。

我明白为什么会这样 - blur 事件显然在 click 事件之前触发,并在点击可以注册到其中一个结果之前隐藏结果列表。我的问题是,我该如何解决这个问题?在文本输入外部单击时,我需要关闭结果列表,但显然我还需要 submit 方法才能正常工作。

这是完整的组件:

<template>
    <div class="search basic-search">
        <input type="text" v-model="search_string" v-on:keyup="search" v-on:focus="activate" v-on:blur="inactivate" class="form-control search" placeholder="Search stocks" />
        <div :class="['search-results', active === true ? 'active' : '']">
            <div class="search-result" v-for="result in search_results" v-on:click="submit(result.id)">
                {{ result.name }} ({{ result.ticker }})
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        data: function() {
            return {
                search_string : '',
                search_results : [],
                active : false
            };
        },

        methods : {
            search : function() {
                const axios_data = {
                    _token  : $('meta[name="csrf-token"]').attr('content'),
                    str : this.search_string
                };

                axios.post('/stock-search', axios_data).then(response => {

                    if(response.data.success){
                        this.search_results = response.data.stocks;
                        this.active = true;
                    }

                });
            },

            activate : function() {
                if(this.search_string !== '')
                    this.active = true;
            },

            inactivate : function() {
                this.active = false;
            },

            submit : function(stock_id) {
                document.location = "/graphs/" + stock_id;
            }
        }
    }
</script>

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    您可以延迟隐藏盒子直到click 触发

    inactivate : function() {
       setTimeout( () => this.active = false, 100)
    },
    

    您也可以尝试使用mousedown 代替click

    <div class="search-result" v-for="result in search_results" v-on:mousedown="submit(result.id)">
    

    不知道有没有确定事件的顺序,但是mousedown应该在blur之前触发。

    【讨论】:

    • 谢谢。但是不使用超时就没有解决方案吗?
    • 我认为你也可以使用 v-on:mousedown 代替 v-on:click
    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2023-03-03
    相关资源
    最近更新 更多