vue.js 触发v-if时输入失去焦点

drkbr07n  于 2023-03-24  发布在  Vue.js
关注(0)|答案(1)|浏览(229)

我得到了一个输入字段:

<input type="text" maxlength="2" :value="valueHours" @input="calculateTimes($event)" @blur="updateValueHours($event)">

还有一张清单:

<div v-if="open" ... >
   <div v-for="..." >
        list rendered here

在输入字段中键入时,我计算应在列表中突出显示的值:

const calculateTimes = async (evt) => {
            evt.stopImmediatePropagation();

            var highlightIndex = null,
                iterator = 0;

            while (highlightIndex === null && iterator < props.options.length) {
                var time = new Date(props.options[iterator].select_value).getHours()
                
                if (time.toString().includes(evt.target.value)) {
                    highlightIndex = iterator;
                    hasFocus.value = iterator;

                    open.value = true;
                    
                    await checkIfListElementIsRendered(`elem-${iterator}`)
                    scrollToFocusedElement();
                }

                iterator++;
            }
        }

open.value被设置为true时会出现问题。输入似乎失去了焦点,导致:value="valueHours"用它当前的空状态覆盖输入。仅仅预填充值(valueHours)并不能解决这个问题。重新聚焦输入也会导致错误的行为。为什么用v-if切换列表会从输入字段中移除焦点?

vqlkdk9b

vqlkdk9b1#

只需在calculateTimes中设置valueHours即可

const calculateTimes = (event) => {
  valueHours.value = event.target.value;
  open.value = true;
};

固定SFCPlayground
或者在输入字段中使用v-model而不是值绑定。

<input
    v-model="valueHours"
    type="text"
    @input="calculateTimes"
    @blur="updateValueHours"
  />

SFCPlayground,带v-model

说明

如果您用途:value绑定,valueHours的值不会被输入更新,因为它是单向绑定的。然后,当Vue在open.value = true之后刷新DOM时,输入再次获得valueHours的初始值。
查看Vue文档了解Form Input Bindingsv-model的工作原理。

相关问题