Vue核心 MVVM模型 数据代理

news/2024/11/26 5:28:21/

1.6.MVVM 模型

在这里插入图片描述

MVVM模型

  • M:模型 Modeldata中的数据
  • V:视图 View,模板代码
  • VM:视图模型 ViewModelVue实例

观察发现

  • data中所有的属性,最后都出现在了vm身上
  • vm身上所有的属性及Vue原型身上所有的属性,在Vue模板中都可以直接使用
<!DOCTYPE html>
<head><meta charset="UTF-8"><title>理解MVVM</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script>
</head>
<body><!-- MVVM模型1.M: 模型Model,data中的数据2.V: 视图View,模板代码3.VM: 视图模型ViewModel,Vue实例观察发现1.data中所有的属性,最后都出现在了vm身上2.vm身上所有的属性及Vue原型身上所有的属性,在Vue模板中都可以直接使用--><!-- 准备好一个容器 --><div id="root"><h2>名称:{{ name }}</h2> <h2>战队:{{ rank }}</h2> <h2>测试:{{ $options }}</h2>	<!-- 视图VIEW --></div><script type="text/javascript">// 阻止vue在启动时生成生产提示Vue.config.productionTip = falsenew Vue({ el: '#root',  	  // 模型MODELdata:{ name: 'uzi',  // 视图模型VIEWMODELrank: 'RNG'},});</script>
</body>
</html>

在这里插入图片描述

1.7.Vue 中的数据代理

Object.defineproperty方法

<!DOCTYPE html>
<head><meta charset="UTF-8"><title>回顾Object.defineProperty方法</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script>
</head>
<body><!-- 准备好一个容器 --><div id="root"></div><script type="text/javascript">// 阻止vue在启动时生成生产提示let number = 18; let person = { name: '张三', sex: '男', };Object.defineProperty(person, 'age', {value:18,enumerable:true, 	// 控制属性是否可以枚举,默认值是falsewritable:true,   	// 控制属性是否可以被修改,默认值是falseconfigurable:true, 	// 控制属性是否可以被删除,默认值是false// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值get() { console.log('有人读取age属性了');return number; },// 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值set(value) { console.log('有人修改了age属性,且值是', value); number = value;}});// console.log(Object.keys(person)) console.log(person)</script>
</body>
</html>

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

<!DOCTYPE html>
<head><meta charset="UTF-8"><title>何为数据代理</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script>
</head>
<body><!-- 数据代理: 通过一个对象代理对另一个对象中的属性的操作, (读/写) --><!-- 准备好一个容器 --><div id="root"></div><script type="text/javascript">let obj1 = { x: 100 }; let obj2 = { y: 200 };Object.defineProperty(obj2, 'x', { get() { return obj1.x }, set(value) { obj1.x = value } });</script>
</body>
</html>
  1. Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)
  2. Vue中数据代理的好处:更加方便的操作data中的数据
  3. 基本原理
    1. 通过object.defineProperty()data对象中所有属性添加到vm
    2. 为每一个添加到vm上的属性,都指定一个 getter setter
    3. getter setter内部去操作(读/写)data中对应的属性

在这里插入图片描述

Vuedata中的数据拷贝了一份到**_data属性中,又将_data里面的属性提到Vue实例中(如name),通过defineProperty实现数据代理,这样通过geter/setter操作 name,进而操作_data中的 name。而_data又对data**进行数据劫持,实现响应式

<!DOCTYPE html>
<head><meta charset="UTF-8"><title>vue中的数据代理</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script>
</head>
<body><!-- 1.Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)2.Vue中数据代理的好处:更加方便的操作data中的数据3.基本原理通过object.defineProperty()把data对象中所有属性添加到vm上为每一个添加到vm上的属性,都指定一个 getter setter在getter setter内部去操作(读/写)data中对应的属性--><!-- 准备好一个容器 --><div id="root"><h2>学校名称:{{ name }}</h2> <h2>学校地址:{{ address }}</h2></div><script type="text/javascript">// 阻止vue在启动时生成生产提示Vue.config.productionTip = falseconst vm = new Vue({ el: '#root',  	  data: { name: '天侠',address: '福建厦门'}});</script>
</body>
</html>

http://www.ppmy.cn/news/49748.html

相关文章

cass常用命令快捷键

01cass等分命令 divide&#xff0c;输入分段个数进行等分 measure命令,输入长度值进行等分 02cass无限缩放命令 SC&#xff0c;SCALE(比例缩放) Z&#xff0c;缩放 03cass坐标快捷命令 V&#xff0c;设置当前坐标 F6&#xff0c;控制状态行上坐标的显示方式 CtrlD&#xff0c…

探索Whisper语音识别

问题一&#xff1a;python多版本切换 背景&#xff1a;有了anaconda环境 还有一个c盘的不知道什么东西 我准备下载一个python3.9.9 去官网 然后安装&#xff0c;安装之前一定要把原来的python卸载干净。 3.9.9安装不上&#xff0c;我用3.10 切换的话&#xff0c;就是去环境…

图像修复(Image Restoration)前沿

背景与现状 图像修复是一个长期存在的低层次视觉问题&#xff0c;旨在从损坏的输入图像中获取高质量图像&#xff0c;例如去模糊、去噪、去雾、去雨以及超分辨等。 L D ( H ) γ \mathbf{L} \mathbf{D}(\mathbf{H}) \gamma LD(H)γ 其中&#xff0c;L是低质量图像&#x…

卧槽!新来的妹纸rm -rf把公司整个数据库删没了,整个项目组慌了~

经历了两天不懈努力&#xff0c;终于恢复了一次误操作删除的生产服务器数据。 对本次事故过程和解决办法记录在此&#xff0c;警醒自己&#xff0c;也提示别人莫犯此错。 也希望遇到问题的朋友能找到一丝灵感解决问题。 事故背景 安排一个妹子在一台生产服务器上安装 Oracl…

DataBinding 大坑总结(网上我暂时搜不到解决方法)

在使用多Module中使用DataBinding会引发一些奇怪的问题&#xff0c;最近好好的腾出时间来折腾这些奇怪的问题&#xff1a; 1&#xff1a;如果当Module启动DataBinding重启AS启动报错的话&#xff0c;就启用允许多行代码 android { defaultConfig {multiDexEnabled true} } de…

CMake基本使用

重要指令 cmake_minimum_required:指定CMake最小版本要求 project&#xff1a;定义工程名称&#xff0c;并可指定语言 set&#xff1a;显示的定义变量 include_directories&#xff1a;向工程添加多个特定头文件搜素路径 link_directories&#xff1a;向工程添加多个特定库文件…

编译器的过度优化

前言 编译器在进行优化的时候&#xff0c;可能为了效率而交换不相关的两条相邻指令的执行顺序。也就是指令重排&#xff0c;这也就引发了一些问题&#xff0c;下面就带大家看两个经典的问题。 单例模式 第一个例子来自单例模式的双加锁&#xff0c;下面是典型的双加锁的单例…

使用FFMPEG库将PCM编码为AAC

准备 ffmpeg 版本4.4 准备一段48000Hz 2 channel f32le 格式的PCM原始数据 这里我们直接使用ffmpeg命令行提取 ffmpeg -i beautlWorld.mp4 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm -ar 采样率 -ac 音频通道 -f f32le 音频样本数据存储格式&#xff08;f32 ---- float…