Vue2学习笔记(二):MVVM模型、数据代理

news2024/9/25 13:23:12

一、MVVM

M(Model): 对应data中的数据
V(View): 也就是模板(template)
VM(ViewModel): 对应Vue实例对象

大多数的前端框架都或多或少借鉴了MVVM模型,其中VM可以看做是View与Model中间的桥梁,它协助页面(View)和数据(Model)的展示。MVVM模型

二、数据代理

1.了解Object.defineProperty()

这是 js 中Object对象中用于设定对象属性的一个方法,可以动态的添加、修改、删除某个对象中的属性。在学习数据代理前需要先了解该方法。
下面的例子为一个对象添加了一个属性:

<!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>数据代理</title>
    <!-- 下载到本地引用 -->
    <script type="text/javascript" src="./js/vue2.js"></script>

</head>
<body>
    <div id="root">
        
    </div>

    <script type="text/javascript">
        // 一个对象
        let people = {
            name: '张三',
            gender: '男'
        };
        // 参数分别为 要修改的对象、要修改的属性、具体的操作
        // 为people添加一个 ‘age’ 属性
        Object.defineProperty(people, 'age',{
            value: 18, //设定属性的值
            enumerable: true, // 是否可被枚举(如果为false则使用Object.keys()就获取不到这个属性)
            writable: true, // 是否可被修改
            configurable: true // 是否可被删除
        });

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

其中enumerable、writable、configurable是最基本且常用的,三者默认的属性都是false
上述只是静态的定义对象属性的值,使用**get()函数(getter)和set()函数(setter)**可以动态的定义对象属性的值

2.认识getter与setter

<!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>数据代理</title>
    <!-- 下载到本地引用 -->
    <script type="text/javascript" src="./js/vue2.js"></script>

</head>
<body>
    <div id="root">
        
    </div>

    <script type="text/javascript">
        let number = 0;
        // 一个对象
        let people = {
            name: '张三',
            gender: '男'
        };
        // 参数分别为 要修改的对象、要修改的属性、具体的操作
        // 为people添加一个 ‘age’ 属性
        Object.defineProperty(people, 'age',{
            enumerable: true, // 是否可被枚举(如果为false则使用Object.keys()就获取不到这个属性)
            configurable: true, // 是否可被删除
            // 当有人访问这个属性时便会被调用
            get(){
                // 将age属性与number绑定 每次读取age属性值时就会返回number的值
                return number;
            },
            // 当有人修改属性age时会被调用
            set(v){
                // 调用的时候如果想要真的修改属性的值需要修改number1的值
                number = v;
            }
        });

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

需要注意的是get与set函数不能与value和writeable属性同时出现!!

三、数据代理

所谓数据代理其实就是用一个对象中的数据去对另一个对象中的属性进行相关操作,包括读和写。

<!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>数据代理</title>
    <!-- 下载到本地引用 -->
    <script type="text/javascript" src="./js/vue2.js"></script>

</head>
<body>
    <div id="root">
        
    </div>

    <script type="text/javascript">
        // 两个对象
        let Obj1 = {a: 10};
        let Obj2 = {b: 20};
        Object.defineProperty(Obj2, 'a',{
            // 读取Obj2的属性a会返回Obj1中a的值
            get(){
                return Obj1.a;
            },
            // 修改Obj2的属性a会修改Obj1中a的值
            set(v){
                Obj1.a = v;
            }
        });

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

四、vue中的数据代理

了解了Object.defineProperty()方法就能更好的理解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>数据代理</title>
    <!-- 下载到本地引用 -->
    <script type="text/javascript" src="./js/vue2.js"></script>

</head>
<body>
    <div id="root">
        <p>{{name}}</p>
        <p>{{age}}</p>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false;
        const vm = new Vue({
            el: '#root',
            // vue其实就是使用了Object.defineProperty()方法对data中的对象进行了代理
            // 这就使得原本需要{{_data.name}}才能使用的数据现在直接使用{{name}}就能直接使用
            data(){
                return{
                    name: '张三',
                    age: 18
                }
            }
        });
    </script>
    
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC(十一)-线程池-ScheduledThreadPoolExecutor分析

ScheduledThreadPoolExecutor 分析 文章目录ScheduledThreadPoolExecutor 分析一、ScheduledThreadPoolExecutor介绍二、ScheduledThreadPoolExecutor应用2.1 ScheduledThreadPoolExecutor 构造器2.2 ScheduledThreadPoolExecutor 应用代码三、ScheduledThreadPoolExecutor源码…

10多个LearnDash示例和演示:从这些在线教育网站获得灵感!

正在寻找真实的LearnDash示例来激发您自己的电子学习网站的灵感&#xff1f; LearnDash 是最受欢迎的 WordPress LMS 插件之一&#xff0c;约翰霍普金斯大学和 Collibra 等大型组织以及 Yoast 和 ProBlogger 等小型品牌都在使用它。 LearnDash在线教育网站定制 LearnDash是最…

基于FireBeetle 2 ESP32-E开发板的LVGL移植及传感器显示(Arduino+TFT_eSPI+LVGL)

目录项目介绍硬件介绍硬件结构说明LVGL移植综合实现功能展示项目总结&#x1f449; 【Funpack2-3】基于FireBeetle 2 ESP32-E开发板的LVGL移植及传感器显示 &#x1f449; CSDN-工程源文件 &#x1f449; Github-KafCoppelia/FireBeetle2_lvgl_sensors 项目介绍 本项目基于Fir…

蓝桥杯寒假集训第三天《灌溉》

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 一个长方形块&#xff0c;在方形块的中间位置有给定的水管&#xff0c;这些水管在单位时间会往上下左右四个方向进行灌溉。问在给定的方块中&#xff0c;一定时间后&#…

PyCharm 发布了新版,支持最新 Python 3.11 和 PyScript 框架

通常而言&#xff0c;使用新潮的或者快速发展的技术&#xff0c;可能会挺有挑战性&#xff0c;你可能得经常阅读文档&#xff0c;才能熟悉新的语法、API 和协议。 PyCharm 2022.2 通过提供对 Python 3.11 的语言特性和新的 PyScript 框架的支持&#xff0c;能够帮助你完成这一…

代码随想录算法训练营day59|503.下一个更大元素II,42. 接雨水

503.下一个更大元素II 503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;单调栈 1. 单调递增栈&#xff1b;在遍历的过程中模拟走两边nums&#xff1b; class Solution {public int[] nextGreaterElements(int[] nums) {if(numsnull || num…

【MySQL】八,角色管理

创建角色 引入角色的目的是方便管理拥有相同权限的用户。恰当的权限设定&#xff0c;可以确保数据的安全性。 语法 CREATE ROLE role_name[host_name] [,role_name[host_name]]...创建一个经理的角色 create role managerlocalhost;给角色赋予权限 创建角色之后&#xff0…

使用 npm link 测试本地编写的 node 模块 / 引入全局安装的 node 模块

目录 1. npm install VS npm install -g 2. npm install -g 的本质&#xff1f;映射脚本的作用&#xff1f; 3. 如何测试使用未发布的 npm 包&#xff1f;npm link 原理&#xff1f; 4. link 到项目 4.1 全局 link 4.2 解除 link 4.3 link 到项目有两种情况&#xff08;…

ansible 第二天

要求&#xff1a; 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下&#xff1a; 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示&#xff1a; 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和…

什么是 Loader、手写 Webpack Loader

目录 1. 什么是 Loader 1.1 Loader 工作原理 1.2 Loader 执行顺序 1.3 内联 Loader 前缀​​​​​​​ 2. 如何开发 Loader 2.1 Loader 长什么样子 2.2 配置本地 Loader 的四种方法 2.2.1 在配置 rules 时&#xff0c;指定 Loader 的绝对路径 2.2.2 在 resolveLoader…

Windows配置万德(Wind)量化接口

原理&#xff1a;wind会在python的第三方库中安装一个属于wind的库 文章目录步骤1:确定python的路径步骤2:配置wind的接口步骤3:检查配置步骤4:使用python提取任意的wind数据步骤1:确定python的路径 如果是默认安装&#xff0c;一般路径是&#xff1a;C:\Users\用户名\Anacond…

磨金石教育摄影技能干货分享|优秀作品欣赏—技巧十足的艺术摄影

想要赏析艺术类的摄影&#xff0c;就得立足于画面身后的意蕴&#xff0c;想作者所想&#xff0c;思作者所思。 这有一定的难度&#xff0c;但也不乏趣味。 今天我们就再来看一组艺术类摄影作品&#xff0c;看看作者如何用高明的技巧表达自己心中的感受吧。 1、江苏省-李玉龙-《…

表白墙 -- 前后端代码详解

表白墙 -- 前后端代码详解一、前端二、后端实现2.1 需求2.2 创建项目及初始化2.3 实现提交数据 (存档)2.3.1 实现 doPost2.3.2 构造请求 (修改 html 文件)2.3.3 验证2.4 实现获取数据 (读档)2.4.1 实现 doGet2.4.2 构造请求 (修改 html 文件)2.4.3 验证三、JDBC 版本 (MySQL)3.…

回味2022

回味20221.前言2.过去的十二个月3.我期望的20231.前言 2021年写给自己的总结&#xff1a;回味2021 一年又一年飞逝的光阴&#xff0c;我想唯有时间留给人的印象最为深刻吧。春去秋来&#xff0c;四季轮回间都是时光的印记。2022年12月30日&#xff0c;25岁的我依旧在这间写下2…

从socket开始讲解网络模式

从socket开始讲解网络模式 windows采用IOCP网络模型&#xff0c;而linux采用epoll网络模型&#xff08;Linux得以实现高并发&#xff0c;并被作为服务器首选的重要原因&#xff09;&#xff0c;接下来讲下epoll模型对网络编程高并发的作用 简单的socket连接 socket连接交互的…

LaoCat带你认识容器与镜像(一)

准备更新一个容器与镜像相关的系列&#xff0c;从Docker到K8s的入门再到实际项目进阶应用&#xff0c;这里感谢好朋友泽鹏&#xff0c;是他让我结识容器与镜像&#xff1b;也感谢上家公司菲恩曼&#xff0c;是它给了我去学习、实践的机会&#xff1b;最后感谢翼哥&#xff0c;一…

Linux系统下at任务调度机制

Linux系统下at任务调度机制 基本介绍 at命令是一次性定时计划任务&#xff0c;at 的守护进程 atd 会以后台模式运行&#xff0c;检查作业队列来运行。默认情况下&#xff0c;atd 守护进程每60秒检查作业队列&#xff0c;有作业时&#xff0c;会检查作业运行时间&#xff0c;如果…

深入理解计算机系统_可重定位目标文件的格式---elf格式

本篇笔记记录可重定位目标文件的格式— elf格式&#xff0c;也是《深入理解计算机系统》第7章的内容。了解这些内容&#xff0c;对我们很有帮助&#xff0c;比如代码排错&#xff0c;可以深入了解C/C 实现原理。 分别介绍如何得到可重定位目标文件及其格式。 2.1 如何得到可重…

操作系统~Linux~线程的互斥,mutex互斥锁的使用及其原理

1.一些基本概念 1&#xff0e;临界资源&#xff1a;凡是被线程共享访问的资源都是临界资源&#xff08;多线程、多进程打印数据到显示器&#xff0c;显示器就是临界资源&#xff09; 2&#xff0e;临界区&#xff1a;代码中访问临界资源的代码&#xff08;在代码中&#xff0c;…

kotlin学习笔记之注解与反射

一、声明并应用注解 一个注解允许你把额外的元数据关联到一个声明上。然后元数据就可以被相关的源代码工具访问&#xff0c;通过编译好的类文件或是在运行时&#xff0c;取决于这个注解是如何配置的。 1、应用注解 在kotlin中使用注解的方法和java一样。要应用一个注解&#xf…