初学 vue3 时,写了个 todoList,列表渲染出来每一个 todo,点击『 修改 』将 todo 变成 el-input,想要其变成输入框时自动获取焦点,这时给 el-input 加上 autofocus 属性时是无效的,因其只有在页面初次渲染时才会自动获取焦点,所以调用官方提供的 api(el-input 向外 defineExpose 暴露出的若干个方法)来主动使其获取焦点,但是在点击『 修改 』的回调中通过 inputRef.value 获取不到其暴露的方法,原因如下:
页面初始化时,显示的是每一个 span todo,而不是 el-input,在点击『 修改 』时,将点击的 todo 变成 el-input,但一开始我是先去调用的获取焦点的 api,再将其变成 el-input,这时 el-input 在页面中都没有渲染出来,因此必须先将 todo 变成 el-input 再调用方法,同时需要在调用方法前使用 nextTick() 使页面的 DOM 变成最新的,不然也是无效果的
总结:
- 调用子组件暴露的方法时,需确保子组件在页面中是渲染出来了的
- 如果是 v-for 渲染出来的多个子组件,多个子组件共享一个 ref,那么 ref.value 获取到的是一个数组