立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。
如果用到message 就只会监听message
就是用到几个监听几个 而且是非惰性 会默认调用一次

  1. <script setup lang="ts">
  2. import { watch, ref, reactive, watchEffect } from "vue";
  3. let msg1 = ref<string>("小雪");
  4. let msg2 = ref<string>("小满");
  5. watchEffect(() => {
  6. console.log('msg1',msg1.value);
  7. });
  8. </script>
  9. <template>
  10. <input type="text" v-model="msg1" />
  11. <input type="text" v-model="msg2" />
  12. </template>

清除副作用

就是在触发监听之前会调用一个函数,可以处理你的逻辑例如防抖

  1. import { watchEffect, ref } from 'vue'
  2. let message = ref<string>('')
  3. let message2 = ref<string>('')
  4. watchEffect((oninvalidate) => {
  5. console.log('message', message.value);
  6. oninvalidate(()=>{
  7. console.log("before");
  8. })
  9. console.log('message2', message2.value);
  10. })

停止跟踪 watchEffect 返回一个函数 调用之后将停止更新

更多的配置项

副作用刷新时机 flush 一般使用post


pre sync post
更新时机 组件更新前执行 强制效果始终同步触发 组件更新后执行
  1. <script setup lang="ts">
  2. import { watch, ref, reactive, watchEffect } from "vue";
  3. let msg1 = ref<string>("小雪");
  4. let msg2 = ref<string>("小满");
  5. const stop = watchEffect(
  6. (oninvalidate) => {
  7. const ipt: HTMLInputElement = document.querySelector(
  8. "#ipt"
  9. ) as HTMLInputElement;
  10. console.log("ipt", ipt);
  11. console.log("msg1", msg1.value);
  12. oninvalidate(() => {
  13. console.log("before");
  14. });
  15. },
  16. {
  17. flush: "post",
  18. }
  19. );
  20. const stopWatch = stop();
  21. </script>
  22. <template>
  23. <input id="ipt" type="text" v-model="msg1" />
  24. <input type="text" v-model="msg2" />
  25. <button @click="stopWatch">停止监听</button>
  26. </template>