美文网首页
Vue数据响应式

Vue数据响应式

作者: 夏炎冰 | 来源:发表于2021-05-06 23:27 被阅读0次

    1.数据响应变化

    在页面上显示会随着值的变化而变化(响应式),,这样更加直观的看到数据的变化

    如果将这个数组或对象输出到页面上,并不会像JS一样输出[Object object]Vue会输出JSON编码后的值

    当一个 Vue 实例被创建时,通过插值语法将数据显示在页面上,当我们修改数据时,页面也会发生变化

    1.1基本类型数据
    <div id="app">{{name}}</div>
    
    
    let data = {
        name:"张三",
        age:""//初始值 
    }
    const vm = new Vue({
        el:"#app",
        data:data
    })
    //data.name == vm.name  =>true
    setTimeout(()=>{
        vm.$data.name="李四"
        // data.name="李四"
    },2000)
    

    1.data数据属性中的数据name和age被Vue实例通过get,和set一直在检测着。
    2.也就是说vue的响应系统一直在观察数据的变化,一旦发生变化,响应系统做出反应,改变视图.所以当数据值发生改变,视图也会产生响应。


    property.png
    特列

    使用Object.freeze(),这个方法是冻结方法,意思是不允许修改对象的属性值,
    这就会阻止修改现有的属性, 数据没发改变,也就不会触发Vue的响应系统

    let data = {
        name:"张三",
        age:"" //以后可能用到赋上默认值
    }
    Object.freeze(data);
    const vm = new Vue({
        el:"#app",
        data:data
    })
    
    1.2引用类型数据
    <div id="app">{{job.name}}{{job.year}}</div>
    
    //数据为对象
    let data = {
        job:{
            name:"医生",
        },
        hero:["钟南山","张伯礼","张定宇","陈薇"]
    }
    const vm = new Vue({
        el:"#app",
        data:data
    });
    setTimeout(()=>{
        data.job={   
            name:"抗疫",  //=>触发响应系统
            year:"2020"  //视图显示
        };
        //data.job.name="抗疫"
    },2000)
    
    1.2.1 将不是响应系统检测的数据添加到响应系统

    $set添加的属性会自动被响应式监听

    $set每次只能新增一个属性,如果要添加多属性时方法不适合

    let data = {
        job:{
            name:"医生",
        },
        hero:["钟南山","张伯礼","张定宇","陈薇"]
    }
    const vm = new Vue({
        el:"#app",
        data:data
    });
    setTimeout(()=>{
        vm.$set(data.job,"year",2020)
    },2000)
    
    1.2.2 修改多个不是响应系统检测的数据

    我们可以采用直接替换属性对象内容的方法来触发响应式,因为响应系统会测试job数据整体的变化
    采用替换对象值的方法来触发响应式

    let data = {
        job:{
            name:"医生"
        },
        hero:["钟南山","张伯礼","张定宇","陈薇"]
    }
    const vm = new Vue({
        el:"#app",
        data:data
    });
    
    setTimeout(()=>{
      data.job={   
            name:"抗疫", //=>触发响应系统
            year:"2020"  //视图改变
        };
    },2000)
    
    1.2.3 解决直接替换对象数据的缺点

    同样的如果采用替换原对象,通过字面量的方式替换,会发现如果我原对象已有多个属性,在通过替换原对象的方式触发响应式的时候,需要不断重写原对象的属性, 就很繁琐.

    所以关于替换原对象,我们可以采用Object.assign 来给原对象扩展属性,然后在赋值给原对象

    let data = {
        job:{
            name:"医生"
        },
        hero:["钟南山","张伯礼","张定宇","陈薇"]
    }
    const vm = new Vue({
        el:"#app",
        data:data
    });
    //在合并后形成新的对象, 在把新对象赋值给vue的数据对象
    setTimeout(()=>{
        data.job = Object.assign({},data.job,{
        year:2020;   
        })
    },2000)
    
    1.2.4 数组数据响应变化

    数组的方法分为两类 (变异和变异)
    变异:会修改原数组的方法(会触发响应) push() pop() shift() unshift() splice() sort() reverse()
    这些方法本身会触发响应系统,而是Vue 包含观察数组的变异方法的功能,所以它会触发响应系统, 然后更新视图

    <div id="app">{{hero}}</div>
    
    let data = {
        hero:["钟南山","张伯礼","张定宇"]
    }
    const vm = new Vue({
        el:"#app",
        data:data
    });
    setTimeout(()=>{
       data.hero.push("陈薇");
        })
    },2000)
    

    非变异:不会改变原数组(不会触发响应) 例如:filter() concat()slice()

    let data = {
        hero:["钟南山","张伯礼","张定宇"]
    }
    const vm = new Vue({
        el:"#app",
        data:data
    });
    setTimeout(()=>{
        data.hero=data.hero.map(item=>{
           return "抗疫英雄:"+item
        })
    },2000)
    

    2. 选项对象method属性

    在vue中,函数被定义成为方法来使用,这些方法定义在methods属性中,然后就可以在vue 表达式中调用函数.

    2.1 定义方法

    vue 选项对象中有一个叫methods的属性.这个属性里面专门来存放一些函数,用来给别人调用

    函数表达式
    function a(){} let a = function(){}

    方法let obj = {
    a:function(){},
    b:function(){}
    }

    Mastache语法中可以使用JavaScript表达式,所以我们可以在Mastache语法中调用函数

    <div id="app">
        {{ state }}
        {{ show(state) }}
    </div>
    
    const vm = new Vue({
        el:"#app",
        data:{
            state:1,
        },
        methods:{
            show:function(id){
                let arr=["苹果","菠萝","梨子"];
                return arr[id]; 
            }
        }
    });
    
    2.2 方法中的this指向

    通过this 获取到实例对象,来拿到data中的数据

    const vm = new Vue({
        el:"#app",
        data:{
            state:1,
        },
        methods:{
            //不需要传参
            show(){
                let arr=["苹果","菠萝","梨子"];
                return arr[this.state]; 
            }
        }
    });
    

    注意, 方法不能使用箭头函数,因为箭头函数的this不是Vue实例, 未来我们在方法中可能会大量使用到Vue实例对象中的属性. 比如获取数据,或者调用其他方法, 如果我们使用了箭头函数就会丢失this,只能通过Vue实例对象来获取。

    2.3 关于方法的数据响应

    数据变化了依赖数据的都可能变化

    <div id="app">
        {{ arr }}
        {{ show() }}
    </div>
    
    const vm = new Vue({
        el:"#app",
        data:{
            arr:[10,20,30,40,50]
        },
        methods:{
            //不需要传参
            show(){
                return this.arr.filter((number)=>{
                         return number >= 20;
                })
            }
        }
    });
    ////arr:[10,20,30,40,50]
    //改变后arr:[20,30,40,50]
    

    方法过滤后的数据也发生了变化
    数据变化触发了Vue响应系统, 进而触发函数重新执行.
    原著:无为

    相关文章

      网友评论

          本文标题:Vue数据响应式

          本文链接:https://www.haomeiwen.com/subject/lwvjdltx.html