vue.js 使用v-for和Typescript在ref上设置focus()

vs91vp4v  于 2023-11-21  发布在  Vue.js
关注(0)|答案(1)|浏览(159)

我的目标是,当点击按钮时,按钮被隐藏,相应的输入被显示并 * 聚焦 *。

let tagIdBeingEdited = ref(0)
let buttons = ref([])
let inputs = ref([])

async function toggleTagInput(id:number, index:number ) {

    tagIdBeingEdited.value = id

    //this does not work
    let a = inputs.value[index] as HTMLInputElement
    nextTick()
    a.focus()
    
}
<div v-for="tag,index in props.tags" :key="tag.id">
            <button v-show="tagIdBeingEdited !== tag.id"  
                    @click="toggleTagInput(tag.id,index)"
                    ref="buttons">{{tag.name}}</button> 

            <input  v-show="tagIdBeingEdited == tag.id"      //show input
                    @keyup.enter="changeTagName"     //change data
                    @keydown.esc="tagIdBeingEdited=0"        //hide input
                    ref="inputs"

字符串
如果我尝试inputs.value[index].focus() Typescript说Property 'focus' does not exist on type 'never'
我花了几个小时在这上面,我应该使用document.getElementById(“).focus()吗?

zsbz8rwp

zsbz8rwp1#

你的代码只是在nextTick之前缺少了一个await,这是一个异步函数。

let a = inputs.value[index] as HTMLInputElement
await nextTick()
a.focus()

字符串
我猜inputs.value[index].focus()是单独尝试的,因为它不是你的代码片段的一部分?在你有机会转换它之前,TypeScript不知道inputs.value[index]是什么类型。只要保持你的代码就像你在你的代码片段中一样,你先转换 * 然后 * 你聚焦。
或者,您可以在首次定义inputs时提供它的类型信息。

let inputs = ref<HTMLInputElement[]>([])


那么inputs.value[index].focus()就可以正常工作了。
Vue Playground示例

相关问题