这样监听不到值的变化(已解决,有情况可以)

628 篇文章 6 订阅
本文通过示例代码探讨了Vue.js中使用`$watch`进行数据监听的情况。重点在于如何监听对象属性的变化,包括直接监听对象和深度监听。示例展示了当直接监听整个对象时,初始赋值改变可以触发回调,但修改对象内部属性不会触发。而通过监听对象的某个属性或者使用深度监听(deep: true),则可以捕获到对象内部属性的变化。
摘要由CSDN通过智能技术生成
<!DOCTYPE html>
<html>
	<div id="app">
            <input type="text" v-model="name">{{name}}
            <input type="text" v-model="age">{{age}}
            <input type="text" v-model="obj.id">{{obj.id}}
            <input type="text" v-model="obj.addr">{{obj.addr}}
	</div>
	
	<script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            data() {
      return {
        name: "",
        age: "",
        obj: {
          id: "1",
          addr: "gz"
        }
      };
    },
    created() {
      this.obj = {
        id:"99",
        addr:"gd"
      }
      // 用法一:  this.$watch("要监听的值",(oldVal,newVal)=>{ })
      
      //这样监听不到对象的变化的
      this.$watch("obj", (newval, oldval) => {
        console.log(newval);
        console.log(oldval);
      });
    }
}).mount('#app')
 
</script>
</html>




可是,这样也监听不到值的变化啊?

<!DOCTYPE html>
<html>
	<div id="app">
            <input type="text" v-model="name">{{name}}
            <input type="text" v-model="age">{{age}}
            <input type="text" v-model="obj.id">{{obj.id}}
            <input type="text" v-model="obj.addr">{{obj.addr}}
	</div>
	
	<script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            data() {
      return {
        name: "",
        age: "",
        obj: {
          id: "1",
          addr: "gz"
        }
      };
    },
    created() {
      this.obj = {
        id:"99",
        addr:"gd"
      }
      // 用法一:  this.$watch("要监听的值",(oldVal,newVal)=>{ })
      this.$watch("name", (newValue, oldValue) => {
        console.log(newValue + "_新值");
        console.log(oldValue + "_旧值");
      });
  
    }
}).mount('#app')
 
</script>
</html>




这样可以

<!DOCTYPE html>
<html>
	<div id="app">
            <input type="text" v-model="name">{{name}}
            <input type="text" v-model="age">{{age}}
            <input type="text" v-model="obj.id">{{obj.id}}
            <input type="text" v-model="obj.addr">{{obj.addr}}
	</div>
	
	<script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            data() {
      return {
        name: "",
        age: "",
        obj: {
          id: "1",
          addr: "gz"
        }
      };
    },
    created() {
      this.obj = {
        id:"99",
        addr:"gd"
      }
      // 用法一:  this.$watch("要监听的值",(oldVal,newVal)=>{ })
      this.$watch("name", (newValue, oldValue) => {
        console.log(newValue + "_新值");
        console.log(oldValue + "_旧值");
      });
      //这样监听不到对象的变化的
     
    },
    watch: {
    age: (newValue, oldValue) => {
      console.log(newValue);
      console.log(oldValue);
    },
    // 监听对象中的某个属性的变化
    "obj.id":(newVal,oldVal)=>{
      console.log(newVal);
      console.log(oldVal);
      
    },
    //深度监听
    obj:{
      handler(newVal,oldVal){
        console.log(newVal);
        console.log(oldVal);
        
      },
    deep:true
    }
  }
}).mount('#app')
 
</script>
</html>




可是,这样也可以啊,
这个原文里面说不可以。

<!DOCTYPE html>
<html>
	<div id="app">
            <input type="text" v-model="name">{{name}}
            <input type="text" v-model="age">{{age}}
            <input type="text" v-model="obj.id">{{obj.id}}
            <input type="text" v-model="obj.addr">{{obj.addr}}
	</div>
	
	<script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            data() {
      return {
        name: "",
        age: "",
        obj: {
          id: "1",
          addr: "gz"
        }
      };
    },
    created() {
      this.obj = {
        id:"99",
        addr:"gd"
      }
      
      //这样监听不到对象的变化的
      this.$watch("obj", (newval, oldval) => {
        console.log(newval);
        console.log(oldval);
      });
    },
    watch: {
    age: (newValue, oldValue) => {
      console.log(newValue);
      console.log(oldValue);
    },
    // 监听对象中的某个属性的变化
    "obj.id":(newVal,oldVal)=>{
      console.log(newVal);
      console.log(oldVal);
      
    },
    //深度监听
    obj:{
      handler(newVal,oldVal){
        console.log(newVal);
        console.log(oldVal);
        
      },
    deep:true
    }
  }
}).mount('#app')
 
</script>
</html>




完整版

<!DOCTYPE html>
<html>
	<div id="app">
            <input type="text" v-model="name">{{name}}
            <input type="text" v-model="age">{{age}}
            <input type="text" v-model="obj.id">{{obj.id}}
            <input type="text" v-model="obj.addr">{{obj.addr}}
	</div>
	
	<script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            data() {
      return {
        name: "",
        age: "",
        obj: {
          id: "1",
          addr: "gz"
        }
      };
    },
    created() {
      this.obj = {
        id:"99",
        addr:"gd"
      }
      // 用法一:  this.$watch("要监听的值",(oldVal,newVal)=>{ })
      this.$watch("name", (newValue, oldValue) => {
        console.log(newValue + "_新值");
        console.log(oldValue + "_旧值");
      });
      //这样监听不到对象的变化的(似乎也可以?我加)
      this.$watch("obj", (newval, oldval) => {
        console.log(newval);
        console.log(oldval);
      });
    },
    watch: {
    age: (newValue, oldValue) => {
      console.log(newValue);
      console.log(oldValue);
    },
    // 监听对象中的某个属性的变化
    "obj.id":(newVal,oldVal)=>{
      console.log(newVal);
      console.log(oldVal);
      
    },
    //深度监听
    obj:{
      handler(newVal,oldVal){
        console.log(newVal);
        console.log(oldVal);
        
      },
    deep:true
    }
  }
}).mount('#app')
 
</script>
</html>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值