3-4 vue生命周期及实例的属性和方法-实例方法/数据

目录:

  •  实例方法/数据

一、实例方法/数据

关于数据的实例方法就只有三个,vue.js的官方文档如下:实例方法/数据

vm.$set(object,key,value) => 更新对象的属性,存在更新,不存在则创建
vm.$delete(object,key)   => 删除对象的属性
vm.$watch(data,callback[,options]) => 监视数据变化,data:数据  callback:回调函数   options:选项,可有可无

1、vm.$set(object,key,value) => 通过vue实例的$set方法为对象添加属性,可以实时监视。

有同学疑问了,我为啥要用这种方式为对象添加属性呐,我按照以往的方式不行吗?接下来我们就试试看:

<body>
    <div id="box">
        <button @click="doUpdate">修改属性</button>
        <button @click="doAdd">添加属性</button>
        <hr>
        <h2>{{user.name}}</h2>
        <h2>{{user.age}}</h2>
    </div>
    <script type="text/javascript" src="../vue.js"></script>
    <script>
        //创建vue实例
        let vm = new Vue({
            el: "#box",
            data:{
                user:{
                    id:1001,
                    name:'tom'
                }
            },
            methods:{
                doUpdate(){
                    this.user.name = "汤姆";
                },
                doAdd(){
                    //通过这种方式为对象添加属性时,vue无法实施监视到
                    this.user.age = 25;
                    console.log(this.user);
                }
            }
        });
    </script>
</body>

输出结果:

很明显,通过这种方式为对象添加属性时,vue无法实施监视到,所以我们需要通过另外一种方式,使得Vue 实时监控,所以我们doAdd()函数可以这样改造:

doAdd(){
    //通过vue实例的$set方法为对象添加属性,可以实时监视
    //this.$set(this.user,'age',25);//存在则修改,不存在则添加

    //全局方式添加
    //Vue.set(this.user,'age',18);
    //console.log(this.user);

    //一般情况下都是通过判断的方式设置age的值
    if(this.user.age){
        this.user.age++;
    }else {
        Vue.set(this.user,'age',18);
    }
},

2、vm.$delete(object,key)  => 删除对象中的某个属性

doDelete(){
    if(this.user.age){
        //局部的
        //this.$delete(this.user,"age");

        //全局的
        //Vue.delete(this.user,"age");
    }
}

3、vm.$watch(data,callback[,options])  => 监视数据变化

①有2种方式监视数据变化:

  • 方式1:使用vue实例的提供watch()方法
  • 方式2:使用vue实例提供的watch选项
<body>
    <div id="box">
        <input type="text" v-model="name">
        <h3>{{name}}</h3>
        <hr>
        <input type="text" v-model="age">
        <h3>{{age}}</h3>
    </div>
    <script type="text/javascript" src="../vue.js"></script>
    <script>
        //创建vue实例
        let vm = new Vue({
            el: "#box",
            data:{
                name: 'tom',
                age: 23
            },
            watch:{ //方式2:使用vue实例提供的watch选项
                age:(newVal,oldVal) => { //监视age属性,newVal:更新后的值、oldVal更新前的值
                    console.log('age被修改啦:原值:'+oldVal+',新值:' + newVal);
                }
            }
        });
        //方式1:使用vue实例的提供watch()方法
        vm.$watch('name',(newVal,oldVal) => { //监视name属性,newVal:更新后的值、oldVal更新前的值
            console.log('name被修改啦:原值:'+oldVal+',新值:' + newVal);
        });
    </script>
</body>

console控制台输出:

那这边有同学要说了,我用计算属性不也是一样的嘛?为啥要用$watch去监视数据的变化呐,$watch把变化后的数据发送ajax请求到后台,这边有计算属性不太合适,场合不对,自己监视用$watch。

注意:$watch这个只有局部的方法,没有全局的watch,如果有全局的,这下如果有两个实例,两个实例有同一个变量,我到底要监视哪一个呐,随意$watch没有全局方法。

②对象数据变化的监视

对象的数据监视跟普通属性变化不一样,对象的值虽然变了,但是内存地址没有变,所以无效,所以要深度监视。

<body>
    <div id="box">
        <!--我想这个Name发生改变,我也能监视-->
        <input type="text" v-model="user.name">
        <h2>{{user.name}}</h2>
    </div>
    <script type="text/javascript" src="../vue.js"></script>
    <script>
        //创建vue实例
        let vm = new Vue({
            el: "#box",
            data:{
                user:{
                    id:1001,
                    name:'jerry' //对象的值虽然变了,但是内存地址没有变,所以无效,所以要深度监视
                }
            },
            watch:{ //方式2:使用vue实例提供的watch选项
                user:{
                    handler:(newVal,oldVal) => { //newVal,oldVal拿的都是user对象,当你执行下一句的时候,地址空间已经更新了
                        console.log('user被修改啦:原值:'+oldVal+',新值:' + newVal);
                    },
                    deep: true //深度监视,当对象中的属性发生变化时也会监视
                }
            }
        });

        //方式1:使用vue实例的提供watch()方法
        vm.$watch('user',(newVal,oldVal) => { ////newVal,oldVal拿的都是user对象
            console.log('name被修改啦:原值:'+oldVal+',新值:' + newVal);
        },{deep: true}); //在后面加一个true表示深度监视,当对象中的属性发生变化时也会监视
    </script>
</body>

console控制台输出:

posted @ 2020-03-05 17:37  帅丶高高  阅读(264)  评论(0编辑  收藏  举报