当前位置: 首页 > news >正文

Vue:模板 MVVM

Vue:模板 & MVVM

    • 模板
      • 插值语法
      • 指令语法
    • MVVM
      • defineProperty
      • 数据代理


模板

Vue实例绑定一个容器,想要向容器中填入动态的值,就需要使用模板语法。模板语法分为插值语法指令语法

插值语法

插值语法很简单,使用{{}}包含一个表达式,Vue会把表达式的结果替代这个值渲染到HTML中。

示例:

<div id="root"><h3>hello,{{name}}</h3>
</div>
<script type="text/javascript">new Vue({el:'#root',data:{name:'jack',}})
</script>

以上代码,最终会生成hello,jack标题,{{name}}被替换为了data.name

此外,任意表达式都可以填入{{}}中,比如:

<div id="root"><h3>hello,{{1 + 1}}</h3><h3>hello,{{x === y ? 'a' : 'b'}}</h3>
</div>

比如{{1 + 1}}最终会变成2,三元表达式会进行计算,或者说函数调用也可以在{{}}内部执行。

另外的,{{}}内的表达式,可以读取到Vue示例的data下的所有属性。


指令语法

插值语法能处理的情况是非常有限的,比如标签属性。

现在有一个<a>标签,要动态的指定url,如果使用插值语法,可能写出如下内容:

<div id="root"><a href="{{addr.url}}">{{addr.name}}</a>
</div>
<script type="text/javascript">new Vue({el:'#root',data:{addr:{name:'百度',url:'http://www.baidu.com',}}})
</script>

但是这是一个错误的语法,{{}}作为标签属性时,不会被解析。

此时就要使用指令语法,v-bind指令可以将一个属性值解析为表达式。

<div id="root"><a v-bind:href="addr.url">{{addr.name}}</a>
</div>

以上代码中,herf属性前面加上了v-bind:,那么后面的""内部不再被解析为字符串,而是当作表达式处理,此时addr.url就会被解析了。

一个v-bind只能作用于其后面的那个属性,比如以下情况:

<div id="root"><a v-bind:href="addr.url" id="addr.name">{{addr.name}}</a>
</div>

id="name"中,addr.name不会被当作表达式,而是当作字符串,因为其前面没用v-bind指令。

v-bind指令可以简写为一个冒号:

<div id="root"><a :href="addr.url">{{addr.name}}</a>
</div>
  • 数据绑定

刚才的v-bind称为单向数据绑定,简单来说就是如果Vue实例中的属性值改变了,那么HTML的内容也会改变。但是如果HTML的内容改变了,Vue实例的内容不会改变。

示例:

<div id="root">单向数据绑定:<input type="text" :value="inner"><br/>
</div>
<script type="text/javascript">new Vue({el:'#root',data:{inner:'hello world'}})
</script>

这是一个输入框,输入框的value属性被绑定为了inner的内容。

在这里插入图片描述

初始时,inner和输入框的内容相同,尝试修改inner的值:

在这里插入图片描述

修改后,输入框的内容也随之改变了。

但是如果修改输入框的内容:

在这里插入图片描述

此时inner的内容不会改变,这就是单向数据绑定,Vue实例的值会影响HTML,但是HTML不会影响Vue实例。

指令v-model可以使用双向数据绑定:

<div id="root">双向数据绑定:<input type="text" v-model:value="inner"><br/>
</div>

此时修改输入框,也会反过来修改Vue实例的值:

在这里插入图片描述

但是不是所有标签都可以使用v-model,只有可以输入元素,类似表单的元素可以使用,其他标签使用会导致报错,并且标签会丢失。

v-model:也可以简写,因为v-model:后面的属性往往是value,表示元素内容,所以可以省略:value,直接写为v-model

<div id="root">双向数据绑定:<input type="text" v-model="inner"><br/>
</div>

MVVM

MVVM是一种软件开发模型,在Vue设计时参考了这个模型,其分为三个组成部分:

  • Model:模型
  • View:视图
  • ViewModel:视图模型

在这里插入图片描述

Model就是一个JavaScript的表达式,简单来说就是数据,比如在{{}}中包含一个表达式,在v-bind后面的" "内部的表达式,这些表达式都会产生一个值,变成具体的数据。

View对应上图中最左侧的DOM,它表示一个可以被用户看到的页面,这个页面通过Vue解析产生。

ViewModel是上图的中间部分,它表示Vue实例对象,这也是整个MVVM的核心,其分为两个区域。

首先是Data Bindings数据绑定,它接收Model产生的值,并把它填入到View视图中,这样就产生了最终的页面。这对应了之前的v-bind指令,或者{{}}插值,他们都是接收JavaScript表达式产生的值,并填入到元素中。

另一个是DOM Listeners元素监听,它监听页面中的元素,当元素发生变化时,返过来影响Model内部的值。这对应的了v-model双向数据绑定,当DOM元素发生更改时,修改Vue.data的内容。

Vue中,JavaScript表达式可以看到Vue实例的所有属性和方法,包括原型链。

输出一下Vue实例:

const vm = new Vue({el:'#root',data:{name:'hello world',num: 123}
})
console.log(vm)

由于Vue实例在MVVM中对应VM,所以接收时常把变量命名为vm

输出结果:

在这里插入图片描述

可以看到,namenum这两个属性最后都进入到了Vue实例中,构造时会把data下面的所有属性都添加到Vue实例中,这就是为什么在{{}}内部可以看到data下面的数据,

仔细看namenum的属性值是(...),这涉及到数据代理的问题。


defineProperty

Object.defineProperty可以给一个对象添加指定的值,并且可以进行属性的复杂配置。

语法:

Object.defineProperty(对象, 属性, {配置对象})
  • 对象:被修改的对象
  • 属性:要添加的属性
  • {配置对象}:添加属性相关的配置

例如给一个对象"张三"添加一个age属性:

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

在配置对象中,value就是配置的属性值,剩下三个属性用于对元素做一些限制。

比如说enumerable控制元素是否可以被遍历,如果为false,那么for in语法就无法获取到这个值,或者通过keys方法无法获得属性名。

后两个比较好理解,就是能否修改与删除。

这些都不是重点,在配置对象中还可以配置函数,其中setget方法非常重要。

get方法在该属性被读取时调用,并且读取元素值时,返回指定值。

Object.defineProperty(person,'age',{get(){console.log('有人读取age属性了')return 123}
})

输出结果:

在这里插入图片描述

此时可以看到,age属性的值变成了(...),表示暂时未知。当访问person.age,调用了get函数并拿到了返回值123

注意:get方法和value属性不能同时设置。

set方法在该属性被设置时调用,接收一个参数value,这就是要设置的值。

实例:

Object.defineProperty(person,'age',{set(value){console.log('有人修改了age属性,值是',value)number = value}
})

输出结果:

在这里插入图片描述

在修改值时,调用了对应的set函数。

注意:set不能和writable属性一起指定。

基于这两个特性,它可以完成一个功能:让一个对象外部的变量与该属性完全同步。

let number = 18
let person = {name:'张三',sex:'男',
}Object.defineProperty(person,'age',{get(){return number},set(value){number = value}
})

以上代码,实现了person.age与变量number的完全同步。当每次读取age时,返回number的值,每次设置age时,把number一起修改。

基于以上操作,就可以完成数据代理。


数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作

示例:

let A = {x:100}
let B = {}Object.defineProperty(B,'x',{get(){return A.x},set(value){A.x = value}
})

以上就是一个数据代理,A.xB.x是完全同步的,操作B.x对应的A.x也会修改,任何时候A.x === B.x

现在再回看之前Vue实例中namenum的变量值为(...),这其实就是一个数据代理。

Vue实例的底部,可以看到四个方法:

在这里插入图片描述

这四个方法分别就是namenumgetset,此处将vm.namevm.num进行了数据代理,代理到data.namedata.num,这样可以保证vm和构造时传入的data完全同步。

而传入data时,有可能传了个匿名对象,data本身也要进行保存,其实vmdata保存为了一个vm._data的对象。

在这里插入图片描述

真正被代理的其实是vm._data,如果不做这层代理,那么用户访问数据时就要写{{ _data.name }}{{ _data.num }},这样有点麻烦,因此做了依次数据代理,将他直接放到vm下,这样就可以直接访问了。

另外的,可以发现在_data中,这两个属性的值也是(...),看着很想数据代理,但这并不是。这是数据劫持,当_data的数据发生改变,就要渲染到HTML页面中,这个过程是由数据劫持完成的。


相关文章:

Vue:模板 MVVM

Vue&#xff1a;模板 & MVVM 模板插值语法指令语法 MVVMdefineProperty数据代理 模板 Vue实例绑定一个容器&#xff0c;想要向容器中填入动态的值&#xff0c;就需要使用模板语法。模板语法分为插值语法和指令语法。 插值语法 插值语法很简单&#xff0c;使用{{}}包含一…...

Kafka 消息丢失如何处理?

今天给大家分享一个在面试中经常遇到的问题&#xff1a;Kafka 消息丢失该如何处理&#xff1f; 这个问题啊&#xff0c;看似简单&#xff0c;其实里面藏着很多“套路”。 来&#xff0c;咱们先讲一个面试的“真实”案例。 面试官问&#xff1a;“Kafka 消息丢失如何处理&#x…...

Mysql报错注入之floor报错详解

updatexml extractvalue floor 是mysql的函数 groupbyrandfloorcount 一、简述 利用 select count(),(floor(rand(0)2))x from table group by x&#xff0c;导致数据库报错&#xff0c;通过 concat 函数&#xff0c;连接注入语句与 floor(rand(0)*2)函数&#xff0c;实现将…...

EPS原理笔记

EPS UE(user equipment)&#xff0c;移动用户设备 LTE(Long Term Evolution)&#xff0c;无线接入网部分&#xff0c;E-UTRAN EPC(system Architecture Evolution、Evoloed Packet Core)&#xff0c;核心网部分&#xff0c;主要包括MME、S-GW、P-GW、HSS&#xff0c;连接Intern…...

LeetCode 876. 链表的中间结点

题目描述: 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0…...

划界与分类的艺术:支持向量机(SVM)的深度解析

划界与分类的艺术&#xff1a;支持向量机&#xff08;SVM&#xff09;的深度解析 1. 引言 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是机器学习中的经典算法&#xff0c;以其强大的分类和回归能力在众多领域得到了广泛应用。SVM通过找到最优超平面来分…...

题目:100条经典C语言笔试题目(1-5)

题目&#xff1a; 1、请填写 bool , float, 指针变量 与“零值”比较的if 语句。 提示&#xff1a;这里“零值”可以是 0, 0.0 , FALSE 或者“空指针” 。例如 int 变量 n 与“零值”比较的 if 语句为&#xff1a; &#xff08;1&#xff09;请写出bool flag 与“零值”比较…...

python代码编写规范及注意事项

目录 1. 注意1.1 变量与常量解释&#xff1a;建议的修复&#xff1a; 1.2 Too many arguments 和 Too many local variables解决方案1. 减少参数数量2. 减少局部变量数量3. 调整 Pylint 配置 总结 1. 注意 1.1 变量与常量 解读下面的pylint问题 C0103: Constant name “file_p…...

【Linux】命令行参数 | 环境变量

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前几天在搞硬件&…...

python 使用进程池并发执行 SQL 语句

这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理&#xff0c;绕过 Python 的全局解释器锁&#xff08;GIL&#xff09;限制&#xff0c;从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…...

我也谈AI

“随着人工智能技术的不断发展&#xff0c;我们已经看到了它在各行业带来的巨大变革。在医疗行业中&#xff0c;人工智能技术正在被应用于病例诊断、药物研发等方面&#xff0c;为医学研究和临床治疗提供了新的思路和方法&#xff1b;在企业中&#xff0c;人工智能技术可以通过…...

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀&#xff0c;这一次讲解的是二叉树的深度搜索&#xff0c;大佬们请阅 1.前言 ⼆叉树中的深搜&#xff08;介绍&#xff09; 深度优先遍历&#xff08;DFS&#xff0c;全称为DepthFirstTraversal&#xff09;&#xff0c;是我们树或者图这样的数据结构中常⽤的⼀种…...

编写第一个 Appium 测试脚本:从安装到运行!

前言 最近接到一个测试项目&#xff0c;简单描述一下&#xff0c;需求就是&#xff1a;一端发送指令&#xff0c;另一端接受指令并处理指令。大概看了看有上百条指令&#xff0c;点点点岂不是废了&#xff0c;而且后期迭代&#xff0c;每次都需要点点点&#xff0c;想想就头大…...

mysql查表相关练习

作业要求&#xff1a; 单表练习&#xff1a; 1 . 查询出部门编号为 D2019060011 的所有员工 2 . 所有财务总监的姓名、编号和部门编号。 3 . 找出奖金高于工资的员工。 4 . 找出奖金高于工资 40% 的员工。 5 找出部门编号为 D2019090011 中所有财务总监&#xff0c;和…...

airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

一&#xff1a;主要内容 框架功能、框架架构及测试报告效果 airtest安装、环境搭建 框架搭建、框架运行说明 框架源码 二&#xff1a;框架功能及测试报告效果 1. 框架功能&#xff1a; 该框架笔者用来作为公司的项目的前端自动化&#xff0c;支持pc和app&#xff0c;本文…...

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…...

python使用pymysql

为了封装这个数据库操作为一个通用方法&#xff0c;我们可以创建一个函数&#xff0c;该函数接受数据库连接参数&#xff08;如主机名、用户名、密码、数据库名&#xff09;、SQL语句以及必要的参数&#xff08;用于参数化查询&#xff09;。下面是一个简单的封装示例&#xff…...

Vue3 + TypeScript 组件和文件命名规范及 setup 导入顺序规范

前言 在 Vue3 项目中&#xff0c;合理的文件命名规范和导入顺序不仅有助于提高代码的可读性&#xff0c;还能增强团队协作的效率。特别是在使用 TypeScript 和 Composition API 的项目中&#xff0c;清晰的组件和文件结构尤为重要。本文将详细介绍 Vue3 TypeScript 项目中的组…...

netty之处理连接源码分析

写在前面 在这篇文章看了netty服务是如何启动的&#xff0c;服务启动成功后&#xff0c;也就相当于是迎宾工作都已经准备好了&#xff0c;那么当客人来了怎么招待客人呢&#xff1f;也就是本文要看的处理连接的工作。 1&#xff1a;正文 先启动源码example模块的echoserver&a…...

Dockerfile文件编写

1、打nginx原始包 登录后复制 ROM nginxENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ENV TZ Asia/Singapore# 设置时区&#xff0c;同样保持在一层 RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \echo "${TZ}" > /etc/timezoneRUN apt-get …...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...