vue3中 dom 组件更新无法触发 watch?

作者站长头像
站长
· 阅读数 6

问题:我通过给 dom 元素绑定 ref,来获取 DOM 元素,我想要在 dom 元素内容更新的时候,触发 watch,或者 watchEffect,我使用 { flush: "post" } 或者 不使用都无法在dom 元素内容改变的时候触发watch。代码如下:

<script setup>
import {ref} from "vue"
const test = ref(null);
setTimeout(() => {
        test.value.innerHTML = "wwwwwww";
}, 2000);

watchPostEffect(
        () => {
            console.log("textContent", test.value);
        }
    );
    watch(
        test,
        (newValue, oldValue) => {
            console.log("watch test", newValue, oldValue);
        },
        { flush: "post" }
    );

    watchEffect(
        () => {
            console.log("textContent", test.value);
        },
        { flush: "post" }
    );
</script>
<template>
<div>
       <div id="test" ref="test">哈哈哈哈哈哈</div>
</div>
</template>
回复
1个回答
avatar
test
2024-07-06

vue3 并不能使用watch 来观察DOM,先不说不能直接侦听响应式对象的属性值,但是DOM对象即便你加了deep也不可以,在源码中可以看到

answer image

DOM对象在这里已经被忽略了

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容