理解MVVM和数据代理

news/2024/7/10 2:35:16 标签: vue

文章目录

  • MVVM
  • Object.defineProperty
  • 数据代理
  • vue 中的数据代理

MVVM

MVVM维基百科

虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例:

const vm = new Vue({
        ...
})

MVVM模型

  1. M:模型(Model) :data 中的数据
  2. V:视图(View):模板代码
  3. VM:视图模型(ViewModel):Vue实例

观察发现:
1、data 中所有的属性,最后都出现在了 vm 身上(可以打印vue实例观察)
2、vm 身上所有的属性及 Vue 原型上所有属性,在 Vue 模板中都可以直接使用

在这里插入图片描述

Object.defineProperty

我们通过 Object.defineProperty 给 person 增加一个 age 属性,然后打印 person 和 自身可枚举属性组成的数组

	Vue.config.productionTip = false
    let person = {
        name:"张三",
        sex:"男"
    }
    Object.defineProperty(person,'age',{
        value:18
    })

    console.log(person)
    console.log(Object.keys(person));

在这里插入图片描述
可以看到只能打印出 name 和 sex 属性。也就是说这种方式添加的属性是不可枚举,也就是不能遍历的

for(let key in person){
	console.log(person[key]);
}

在这里插入图片描述
我们可以对 Object.defineProperty进行配置,增加可以枚举、可以修改、可以被删除的配置

	let person = {
        name:"张三",
        sex:"男"
    }
    Object.defineProperty(person,'age',{
        value:18,
        enumerable:true,//控制属性是否可以枚举,默认false
        writable:true,//控制属性是否可以修改,默认false
        configurable:true//控制属性是否可以被删除,默认false
    })

    console.log(person);

我们这里只测试一下删除功能,控制台输入 delete person.age
在这里插入图片描述
还可以在其中增加 getter 和 setter

	let number = 19
    let person = {
        name:"张三",
        sex:"男"
    }
    Object.defineProperty(person,'age',{
        //当读取person的age属性时,get函数会被调用,且返回值就是age的值
        get:function () {
            console.log("读取了age属性");
            return number
        },
        //当修改person的age属性时,set函数(setter)会被调用,且能收到值
        set(value){
            console.log("修改了age属性,值为"+value);
            number = value
        }
    })

在这里插入图片描述

数据代理

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

我们来写一个最简单的数据代理

	let obj = {x:100}
    let obj2 = {y:200}

    Object.defineProperty(obj2,'x',{
        get(){
            return obj.x
        },
        set(value){
            obj.x = value
        }
    })

这样我们可以通过 obj2 也可以操作 obj 的 x

在这里插入图片描述
首先打印了 obj2,除了自身的 y,还有 obj 的 x
现在修改 obj2.x = 200
我们再打印 obj 发现其中的 x 变成了 100

vue__110">vue 中的数据代理

在这里插入图片描述
总结

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


http://www.niftyadmin.cn/n/1816776.html

相关文章

将IP地址转换为地方名称

下面这段代码将IP地址转换为地方名称,例如你的IP地址为 “58.24.25.65” 则显示为 “上海徐汇区” 当然转换过程中,需要有数据库,也就是这里适用的数据库是动网论坛最新版本DVBBS8.1提供的数据库,你可以到dvbbs下载那个论坛&#…

Vue中事件处理

文章目录事件处理事件修饰符键盘事件一些使用技巧事件处理 给按钮绑定一个 click 事件&#xff0c;点击弹出提示信息 <!--普通写法--><button v-on:click"showInfo">点我</button><!--简写--><button click"showInfo">点我…

Vue 计算属性-姓名案例

文章目录姓名案例-插值语法实现姓名案例-methods实现姓名案例-计算属性实现计算属性简写姓名案例-插值语法实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue初识</title><script typ…

[转贴]jQuery使用手册

翻译整理&#xff1a;Young.J 官方网站&#xff1a;http://jquery.com jQuery是一款同prototype一样优秀js开发库类&#xff0c;特别是对css和XPath的支持&#xff0c;使我们写js变得更加方便&#xff01;如果你不是个js高手又想写出优 秀的js效果&#xff0c;jQuery可以帮你…

Vue 监视属性-天气案例

文章目录天气案例实现两个注意事项监视属性深度监视监视的简写形式天气案例实现 <div id"root"><h2>今天天气很{{info}}</h2><button click"changeWeather">切换天气</button> </div><script type"text/javas…

也论WebForm与MVC: 我是哪种程序员?

基本上, 对MVC和WebForm的选择和感受因人而异, 瞎说了6种情况, 大过年的, 博大家一乐~Beginner:好且简单 -> WebForm, 哥们我也能写程序了耶...Bring Something On:做的更好且更清晰 -> MVC, 懂这么多还需要让别人隐藏细节的同时碍手碍脚? 俺更关注XXX.., 好处s are her…

watch 和 computed 对比-姓名案例

文章目录watch 实现computed 实现watch 实现 <div id"root">姓&#xff1a;<input type"text" v-model"firstName"><br/><br/>名&#xff1a;<input type"text" v-model"lastName"><br/&…

sql 利用索引优化性能

人们在使用sql时往往会陷入一个误区&#xff0c;即太关注于所得的结果是否正确&#xff0c;而忽略了不同的实现方法之间可能存在的性能差异&#xff0c;这种性能差异在大型的或是复杂的数据库环境中&#xff08;如联机事务处理oltp或决策支持系统dss&#xff09;中表现得尤为明…