• 两者都可监听 data 属性变化
    • watch 需要明确出要被监听的属性
    • watchEffect 会根据其中的属性,自动监听其变化
    1. <template>
    2. <p>watch watchEffect</p>
    3. <p>{{numRef}}</p>
    4. <p>{{name}} {{age}}</p>
    5. </template>
    6. <script>
    7. import { reactive, ref, toRefs, watch } from 'vue';
    8. export default {
    9. name: 'watch',
    10. setup() {
    11. const numRef = ref(100);
    12. const state = reactive({
    13. name: "zwx",
    14. age: 26
    15. })
    16. watch(numRef, (newNum, oldNum) => console.log('监听到了watch的变化', newNum, oldNum), {
    17. immediate: true // 初始化即监听
    18. })
    19. // setTimeout(() => {
    20. // numRef.value = 101
    21. // }, 1000)
    22. watch(
    23. // 确定要监听的属性
    24. () => state.age,
    25. (newStateAge, oldStateAge) => {
    26. console.log('state watch', newStateAge, oldStateAge)
    27. },
    28. {
    29. immediate: false,
    30. deep: false // 深度监听
    31. }
    32. )
    33. setTimeout(() => {
    34. state.age = 27;
    35. }, 1000)
    36. setTimeout(() => {
    37. state.name = 'pw';
    38. }, 3000)
    39. return {
    40. numRef,
    41. ...toRefs(state)
    42. }
    43. }
    44. }
    45. </script>
    // 初始化时 一定会执行一次 (原因:收集要监听的数据)
    watchEffect(() => {
      console.log('hello')
    })
    
    watchEffect(() => { // 初始化和在 state.name 改变时会触发
      console.log('state.name', state.name)
    })