Vue基础2之MVVM模型和数据代理

MVVM模型

M:模型(model):对应data中的数据
V:视图(View):模板代码
VM:视图模型(ViewModel):Vue实例对象
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MVVM模型</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
    你好,{{name}} <br>
    我的学校是:{{school}} <br>
    VM中的原型方法:{{_c}}
</div>
<script>
    const vm=new Vue({
        el:"#app",
        data:{
            name:"张三",
            school:"幸福中学"
        }
    })
    console.log("vm",vm)

</script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

本质:
在这里插入图片描述
观察发现:
1.data中的所有属性,最后都出现在了vm身上
2.vm身上的所有属性,及Vue原型身上的所有属性,在Vue模板中都可以直接使用

数据代理

Object.defineproperty方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Object.defineproperty方法</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        sex:"男",
    }
    Object.defineProperty(person,'age',{
        value:18
    })

    // age不能枚举
    console.log("枚举",Object.keys(person))
    // age不能修改
    // age不能删除


    console.log(person)

</script>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Object.defineproperty方法</title>
</head>
<body>
<script>
    let person={
        name:"张三",
        sex:"男",
    }
    Object.defineProperty(person,'age',{
        value:18,
        enumerable:true,   //控制属性是否可以枚举,默认值是false
        writable:true,     //控制属性是否可以被修改,默认值是false
        configurable:true   //控制属性是否可以被删除,默认值是false
    })

    console.log(person)

</script>
</body>
</html>

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Object.defineproperty方法</title>
</head>
<body>
<script>
    let number=18
    let person={
        name:"张三",
        sex:"男",
    }
    Object.defineProperty(person,'age',{
        get:function(){
            console.log("有人读取age属性了")
            return number
        },
        set(value){
            console.log("有人修改age属性了")
            number=value
        }
    })

    console.log(person)

</script>
</body>
</html>

在这里插入图片描述

数据代理

通过一个对象代理对另一个对象中属性的操作(读/写)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据代理</title>
</head>
<body>
<script>
    let obj={x:50}
    let obj2={y:20}

    Object.defineProperty(obj2,'x',{
        get(){
            return obj.x
        },
        set(value){
            obj.x=value
        }
    })
</script>
</body>
</html>

在这里插入图片描述

数据代理在Vue中的应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数据代理在Vue中的应用</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
    你好,{{name}} <br>
    欢迎来到{{school.name}}!
</div>
<script>
    let vm=new Vue({
        el:"#app",
        data:{
            name:"张三",
            school:{
                name:"幸福中学"
            } 
        }
    })
</script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
数据代理思想:
在这里插入图片描述

  1. Vue中的数据代理:
    通过vm对象来代理data对象中属性的操作(读/写)
  2. Vue中数据代理的好处:
    更加方便的操作data中的数据
  3. 基本原理
    通过Object.defineProperty()把data中所有的属性都添加到vm上
    为每一个添加到vm上的属性,都指定一个getter/setter
    在getter/setter内部去操作(读/写)data中对应的属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值