数据的双向绑定

mvvm是一种设计模式,解决了双向数据绑定(效果:数据改变了,视图也跟着变化)的问题

其中,m代表视图层,v代表模型层,vm代表视图模型层

实现思路----vm实例(vue实例充当了数据和视图之间的桥梁作用)

 问题分析:

从数据到视图-----响应式原理

1.怎么知道数据变了

  <!-- 显示obj.a的内容 -->
    <div id="app">
        1
    </div>
    <script>
        let obj={a:5}
        // 检测到属性值的变化,并捕捉到
        Object.defineProperty(obj,'a',{
            set:function(newVal) {
                // alert(`更改之后的属性值为${newVal}`)
                // const app=document.getElementById("app")
                // console.log(app);
                // 更新dom的内容
                document.getElementById('app').innerHTML=newVal
            }
        })
    </script>

2.怎么实现数据改了,多处视图跟着改变

set可以检测到属性值的改变 ,获取到元素的内容并把后面改变的值赋给该元素的内容

dom中内容的改变

例子

  <!-- 显示obj.a的内容 -->
    <div id="app">
        1
    </div>
    <script>
        let obj={a:5}
        // 检测到属性值的变化,并捕捉到
        Object.defineProperty(obj,'a',{
            set:function(newVal) {
                // alert(`更改之后的属性值为${newVal}`)
                // const app=document.getElementById("app")
                // console.log(app);
                // 更新dom的内容
                document.getElementById('app').innerHTML=newVal
            }
        })
    </script>

你如何得知,我在什么时候,改了哪个属性值 

<script>
        const obj={a:2,b:3,d:4}
        // 你如何得知,我在什么时候,改了哪个属性值
        for(let key in obj) {
            console.log(key);
            Object.defineProperty(obj,key,{
            set:function(newVal) {
                console.log(`有人改了${key}`,`改成了${newVal}`);
            }
          })
        }
        
    </script>

Object.defineProperty()  里面的set和get可以拦截到数据变化 set当对象的属性变化时触发

get把变化后的属性值返回出去

响应式原理  作用 更精细化定义(添加,修改)对象的属性

参数1---obj:要定义属性的对象

参数2---property:要定义或修改的属性名

参数3---descriptor:对参数2的描述,是一个具有固定属性的字面对象

<script>
        // 格式:Object.definePropery(obj,prop,descriptor)
        // 声明一个obj对象 属性名为a 属性值为1
        // 原始的声明方式
        const obj={a:1}
        console.log(obj);
        // 精细化的定义对象的方式
        Object.defineProperty(obj,'b',{
            // 定义属性b的初始值就是value的值
            // 没有定义值就是undefined
            value:3,
            // 可读写 可以修改属性b的属性值
            writable:true
        })
        Object.defineProperty(obj,'c',{
            // 不写value属性 
            // c属性的初始值就是undefined
            // value:''
            // 只读 不可改变
            // writable:false
            configurable:false,
            // 两个特点:1.不能用Object.defineProperty再次定义
            // 2.不能删除这个属性
            // enumerable为true 这个对象的属性可以遍历
            enumerable:true
        })
        Object.defineProperty(obj,'d',{
            value:13,
            // enumerable为true 这个对象的属性不可以遍历 例如:d,b
            enumerable:false
        })
        for(let k in obj) {
            console.log(k);
            console.log(obj[k]);
        }
        // 会报错 不能重复定义c属性
        // Object.defineProperty(obj,'c',{
        //     value:12
        // })
        delete obj.c
        // c的属性值没有改变还是undefined
        obj.c=5
        obj.b=10
        // Object.getOwnPropertyDescriptor(参数1:要操作的对象,属性)
        console.log(obj);
    </script>

 // 会报错 不能重复定义c属性

        // Object.defineProperty(obj,'c',{

        //     value:12

        // })

 

a属性是可以修改的 writable的值true 

 

 getOwnPropertyDescriptor(参数1:要操作的对象,参数2:要操作的属性) 获取自己对象的描述

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值