在 Vue 中,onMounted 钩子函数会在组件被挂载到 DOM 后立即调用。然而,如果在父组件的 onMounted 钩子函数中尝试获取子组件的 DOM 元素,可能会遇到问题,因为子组件可能还没有完成挂载。
如果需要在父组件的 onMounted 钩子函数中获取子组件的 DOM 元素,你可以使用 nextTick() 方法。nextTick() 方法会在下一次 DOM 更新循环结束之后延迟执行回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
以下是一个示例:
import { nextTick } from 'vue';
onMounted(() => {
nextTick(() => {
// 在这里获取 DOM 元素
init();
});
});
在上面的代码中,我们在 onMounted 钩子函数中使用了 nextTick() 方法来延迟执行 init 函数。这样,当 init 函数被调用时,子组件的 DOM 元素应该已经被挂载到 DOM 中,此时应该能够获取到它们。
当然,如果不确定下一次一定会获取到它们,还可以使用我喜欢的终极方案 watch:
onMounted(() => init()) // 正常加载
watch(toRef(elRef), () => init()); // 如果绑定的 ref 元素发生了变化,则会加载 init
在这里,通过监听 elRef 元素的变化,来执行 init 方法。因为 watch 是惰性监听,仅在监听源发生变化时才会执行,所以不用担心第一次绑定时会在 onMounted 和 watch 中触发两次 init。
文章评论