文章目录
现象
el-input被外层div包裹了,设置autofocus不起作用:
html
<el-dialog v-model="visible" :title="title" :append-to-body=true width="50%">
<el-form v-model="theForm" @submit.prevent="submit">
<el-form-item v-for="item in formItems" :label="item.label" :label-width="120">
<el-input v-model="theForm[item.name]" ref="inputRef"
autocomplete="off"
@keyup.enter.stop="submit"
autofocus/>
</el-form-item>
</el-form>
<template #footer>
<span>
<el-button type="primary" @click="cancel()">取消</el-button>
<el-button type="primary" @click="submit()">确定</el-button>
</span>
</template>
</el-dialog>
在onMounted()中尝试: inputRef.value.focus(),也无效。怀疑是调用时机不对,但何时才是页面dom都生成好的时机呢?
两次nextTick()加setTimeout()解决
javascript
// 需要调用两次nextTick才能获得实例!!!
const focusInput = () => { nextTick(() =>
nextTick(()=>{
setTimeout(function () {
let _eles = document.querySelectorAll('form input.el-input__inner')
// console.log(_eles)
_eles[0].focus()
// inputRef.value.focus()
}, 100);
}))}
onMounted(() => {
focusInput()
})
结论
在vue3组件嵌套复杂时,很难确定组件之间的初始化顺序,这时尽可能让访问时机靠后是一个通用的解决方法。