No.2 Vue2.0——Vue的基础说明

2 篇文章 0 订阅
本文详细介绍了MVVM模型,重点探讨了JavaScript的defineProperty方法,包括如何设置不可枚举、不可删除和不可修改的属性,以及setter和getter的使用。接着,文章阐述了Vue中的数据代理机制,展示了如何通过数据代理实现属性的读写操作,并通过实例解释了Vue如何通过getter和setter实时更新视图。最后,总结了Vue数据代理的优势及其基本原理。
摘要由CSDN通过智能技术生成

一、前景提要

No.1 初步认识Vue2.0中已经完成了一下几点:

  1. Vue2.0的下载安装以及引入
  2. Vue中的{{ }}绑定
  3. 表单的绑定事件:双向/单向绑定
  4. el与data的几种书写方式

二、MVVM模型简述

M:模型model,对应data中的数据,对应Vue中的数据,(Plain JavaScript Object)
V:视图view,模板(dom)
VM:视图模型viewModel:Vue对象

MVVM模型

三、回顾defineproperty方法

3.1 不可枚举、不可删除、不可修改属性的介绍及更改

<script>
    let person = {
        name : "张三",
        sex : "男",
    }
    // 通过defineProperty方法向person中添加age属性
    Object.defineProperty(person,'age',{
        value:18
    })
    // 遍历出可以枚举的属性
    // 方法一
    console.log(Object.keys(person))
    // 方法二
    for(let key in person){
        console.log(person[key])
    }
    // 输出person的内容
    console.log(person)
</script>

输出结果
不可枚举案例
想要可以枚举的办法:添加属性


// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
    value:18,
    enumerable:true,    // 控制属性是否可以枚举,默认是false
    writable:true,  // 控制属性是否可以被修改,默认是false
    configurable:true,   //控制属性是否可以被删除,默认是false
})
// 遍历出可以枚举的属性

3.2 setter函数的使用

<script>
    let number = 18;
    let person = {
        name : "张三",
        sex : "男",
    }
    // 通过defineProperty方法向person中添加age属性
    Object.defineProperty(person,'age',{
        // 当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
        get:function(){
        	// console.log("有人调用person中的key")
            return number
        }
    })
    // 遍历出可以枚举的属性
    // 方法一
    console.log(Object.keys(person))
    // 方法二
    for(let key in person){
        console.log(person[key])
    }
    // 输出person的内容
    console.log(person)
</script>

控制台输出效果此时修改number的值时,将会同步修改person中的age的属性值,且修改person中的age时将不会生效

调用age的顺序图简写:

<script>
    let number = 18;
    let person = {
        name : "张三",
        sex : "男",
    }
    // 通过defineProperty方法向person中添加age属性
    Object.defineProperty(person,'age',{
        // 当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
        get(){
            console.log("有人调用person中的key")
            return number
        }
    })
</script>

3.3 getter函数的使用

<script>
    let number = 18;
    let person = {
        name : "张三",
        sex : "男",
    }
    // 通过defineProperty方法向person中添加age属性
    Object.defineProperty(person,'age',{
        // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就
        get(){
            console.log("有人调用person中的key")
            return number
        },
        // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修
        set(value){
            console.log("有人修改了age属性,值为",value)
        }
    })
    // 遍历出可以枚举的属性
    // 方法一
    console.log(Object.keys(person))
    // 方法二
    for(let key in person){
        console.log(person[key])
    }
    // 输出person的内容
    console.log(person)
</script>

setter函数的使用如果想要改变,可以让number进行改变

<script>
    let number = 18;
    let person = {
        name : "张三",
        sex : "男",
    }
    // 通过defineProperty方法向person中添加age属性
    Object.defineProperty(person,'age',{
        // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
        get(){
            console.log("有人调用person中的key")
            return number
        },
        // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的值
        set(value){
            console.log("有人修改了age属性,值为",value)
            number = value
        }
    })
</script>

四、数据代理

4.1 何为数据代理

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

<script>
    let obj = {
        x:100
    }
    let obj2 = {y:200}
    // 通过defineProperty方法向person中添加age属性
    Object.defineProperty(obj2,'x',{
        // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
        get(){
            console.log("有人调用obj中的x")
            return obj.x
        },
        // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的值
        set(value){
            console.log("有人修改了obj2中的x属性,值为",value)
            obj.x = value
        }
    })
    // 遍历出可以枚举的属性
    // 方法一
    console.log(Object.keys(obj2))
    // 方法二
    for(let key in obj2){
        console.log(obj2[key])
    }
    // 输出person的内容
    console.log(obj2)
</script>

简单的代理说明

4.2 Vue中的数据代理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue中的数据代理</title>
    
    <script type="text/javascript" src="js/vue.js"></script>
</head>
<body>
    <!-- 创建一个容器 -->
    <div id="root">
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
    </div>

    <script>
        // 阻止vue产生生产提示
        Vue.config.productionTip = false;

        const vm = new Vue({
            el:'#root',
            data:{
                name : "爱我中华!",
                address : "中国"
            }
        })
    </script>
</body>
</html>

页面展示效果

vm的调用机制有人访问这些值的时候getter工作,修改时setter开始工作,值将从data中拿取,与本文4.1中的代理一样
Vue的代理机制
data中的数据一旦发生改变,页面将实时更新

数据代理流程图示

4.3 总结

Vue中的数据代理:通过vm对象来代理data对象中的属性的操作(读/写)
Vue中数据代理的好处:更加方便的操作data中的数据
基本原理:

  1. 通过Object.defineProperty()把data对象中所有属性添加到vm上
  2. 为每一个添加到vm上的属性,都指定一个getter/setter
  3. 在getter/setter内部去操作(读/写)data中对应的属性

4.4 扩展

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jule_zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值