当前位置: 首页 > 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 …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...