vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue深度监听

在Vue中实现深度监听的示例代码

作者:2301_76303308

在 Vue 中,深度监听是指监听一个对象或数组的嵌套属性(深层结构)的变化,而不仅仅是监听顶层属性的引用变化,本文给大家介绍了如何在Vue中实现深度监听,并通过代码示例介绍的非常详细,需要的朋友可以参考下

一、什么是深度监听?

在 Vue 中,深度监听是指监听一个对象或数组的嵌套属性(深层结构)的变化,而不仅仅是监听顶层属性的引用变化。Vue 的响应式系统默认只监听对象的浅层属性(即直接属性),如果需要监听对象内部的嵌套属性变化,就需要启用 深度监听。

二、实现深度监听的方法

Vue 提供了 watch 选项(或 @watch 装饰器)来监听数据变化,通过设置 deep: true 可以实现深度监听。以下是具体实现方式:

1. 使用 watch 选项

语法

watch: {
  // 监听的对象
  obj: {
    handler(newVal, oldVal) {
      console.log('obj 变化了:', newVal, oldVal);
    },
    deep: true // 开启深度监听
  }
}

完整示例

new Vue({
  el: '#app',
  data() {
    return {
      obj: {
        a: 1,
        b: {
          c: 2
        }
      }
    };
  },
  watch: {
    obj: {
      handler(newVal, oldVal) {
        console.log('obj 更新:', newVal);
      },
      deep: true
    }
  },
  methods: {
    changeObj() {
      this.obj.b.c = 3; // 修改深层属性
    }
  }
});

2. 使用 $watch 方法

this.$watch('obj', (newVal, oldVal) => {
  console.log('obj 变化:', newVal);
}, {
  deep: true
});
new Vue({
  el: '#app',
  data() {
    return {
      obj: {
        a: 1,
        b: { c: 2 }
      }
    };
  },
  mounted() {
    this.$watch('obj', (newVal, oldVal) => {
      console.log('obj 更新:', newVal);
    }, {
      deep: true
    });
  },
  methods: {
    changeObj() {
      this.obj.b.c = 3;
    }
  }
});

3. 监听特定嵌套属性(避免深度监听)

watch: {
  'obj.b.c'(newVal, oldVal) {
    console.log('obj.b.c 变化:', newVal, oldVal);
  }
}

三、深度监听的工作原理

四、注意事项

handler(newVal) {
  const oldVal = JSON.parse(JSON.stringify(newVal));
  // 比较逻辑
}

数组特殊情况

watch: {
  'arr[0].a': {
    handler(newVal) {
      console.log('arr[0].a 变化:', newVal);
    },
    deep: true
  }
}

五、实际应用场景

watch: {
  form: {
    handler(newVal) {
      this.validateForm(newVal);
    },
    deep: true
  }
}

六、面试扩展

如果面试官追问,我可以补充:

替代方案:用 computed 计算属性配合 watch

computed: {
  objComputed() {
    return JSON.stringify(this.obj); // 转为字符串比较
  }
},
watch: {
  objComputed(newVal, oldVal) {
    console.log('obj 变化:', newVal);
  }
}

性能优化:结合 immediate: true(初始触发)或防抖(debounce):

watch: {
  obj: {
    handler: _.debounce(function(newVal) {
      console.log('节流更新:', newVal);
    }, 300),
    deep: true
  }
}

七、总结

到此这篇关于在Vue中实现深度监听的示例代码的文章就介绍到这了,更多相关Vue深度监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文