目录

  • 1.计算属性:
      • 1.概述:
      • 2.语法特点:
      • 3.案例:
        • 案例1:
        • 案例2:
        • 案例3:
      • 4.总结:
      • 5.get函数什么时候执行?
      • 6.注意:
  • 2.监视属性:
      • 1.概述:
      • 2.用法:
        • 1.监视单个属性值:
          • 写法1:在Vue实例对象时配置:
          • 写法2:Vue实例对象完成后,配置监视属性
          • 测试结果展示:
        • 2.深度监视:
          • 1.监视对象的一个属性:
          • 2.监视整个对象:
      • 3.监视属性的简写:只适用于单个属性等简单逻辑的监视
      • 4.总结:

1.计算属性:

1.概述:

   简单来说,计算属性就是通过Vue实例中data中已存在的属性,经过逻辑运算得到一个新属性;

2.语法特点:

  • 1.定义Vue实例vm
  • 2.在vm中定义el和data属性
  • 3.在data属性中定义相关属性(数据)
  • 4.在vm中定义computed计算属性
  • 5.在计算属性中定义函数,执行对data属性中定义相关属性的逻辑运算
  • 6.如果需要对计算属性的值进行读写操作,还需要在计算属性中定义的函数中定义get/set方法
  • 7.并且通过set方法修改计算数值的值时,必须要引起参与计算属性的变量的改变
  • 8.因为get方法具有缓存机制,只有当数据改变后才会再次执行,如果通过set修改计算属性的值时,不改变参与计算的值,那么get方法就不会执行,更新后的数据也就不会同步更新到页面上了

3.案例:

案例1:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root"><h2>全名:{{fullName}}</h2>姓:<input type="text" v-model="firstName"/><br/>名:<input type="text" v-model="laseName"/><br/>全名:<input type="text" v-model="fullName"/>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {firstName: '张',laseName: "三"}},computed: {//计算属性fullName: {get() {//有缓存 只执行一次 如果改变了  需要二次执行console.log("执行了fullName计算")return this.firstName + "-" + this.laseName;},set(value) {console.log("改变计算属性:", value)//在修改是 要引起 参与计算属性的变量的改变let arr = value.split("-");this.firstName = arr[0];this.laseName = arr[1];}}}).$mount("#root");
</script>
</body>
</html>

说明:在上面案例中,我们给Vue实例添加了一个计算属性,通过实例中data对象的firstname属性和lastname属性计算获取fullname,并将计算属性fullname展示到了页面上。由于我们在计算属性的函数中添加了get/set方法,并在set方法中修改fullname的值后,将新的值赋值给了实例中data对象的firstname属性和lastname属性,所以可以实现浏览器页面上改变fullname的值时,firstname属性和lastname属性以及最上面的fullname的值的同步变化 ,如下图所示;

案例2:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root"><h2>全名:{{fullName}}</h2>姓:<input type="text" v-model="firstName"/><br/>名:<input type="text" v-model="laseName"/><br/>全名:<input type="text" v-model="fullName"/>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {firstName: '张',laseName: "三"}},computed: {//计算属性fullName: {get() {//有缓存 只执行一次 如果改变了  需要二次执行console.log("执行了fullName计算")return this.firstName + "-" + this.laseName;},set(value) {console.log("改变计算属性:", value)}}}).$mount("#root");
</script>
</body>
</html>

在案例2中,我们在set方法中只改变fullname的值后,而没有将新的值赋值给了实例中data对象的firstname属性和lastname属性,那么在页面中对应的属性就不会同步更新,因为对于get方法来说,数据未发生改变,就不会再执行了,测试结果如下图所示;

案例3:
 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root"><h2>全名:{{fullName}}</h2>姓:<input type="text" v-model="firstName"/><br/>名:<input type="text" v-model="laseName"/><br/>全名:<input type="text" v-model="fullName"/>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {firstName: '张',laseName: "三"}},computed: {//简写  只读fullName() {//有缓存 只执行一次 如果改变了  需要二次执行console.log("执行了fullName计算")return this.firstName + "-" + this.laseName;}}}).$mount("#root");
</script>
</body>
</html>

说明:如果对于计算属性的结果只有读取操作,那么就可以简写计算属性中的函数了,只需在计算属性的函数中定义执行逻辑即可,由于缓存机制,只要该值不发生改变,就可以正常展示到页面上;因为没有set方法,如果此时在页面上修改计算属性的值,就会报错。

4.总结:

  • 要用的属性不存在,需要通过已有的属性计算的来
  • 底层借助了 Object.defineproperty() 方法 提供了set get

5.get函数什么时候执行?

  1. 在初次读取时执行一次
  2. 当依赖属性改变时在次执行

6.注意:

  1. 计算属性最终会出现在vm上 可以直接调用
  2. 如果计算属性要被修改 ,就必须写set函数,还要引起依赖属性的改变
  3. 如果不考虑 修改 可以简写:

2.监视属性:

1.概述:

<font style="color:rgba(0, 0, 0, 0.85);">在 Vue 中,监视属性(</font>`<font style="color:rgba(0, 0, 0, 0.85);">watch</font>`<font style="color:rgba(0, 0, 0, 0.85);">)用于监听一个特定的数据属性,并在该属性发生变化时执行相应的回调函数。</font>

2.用法:

1.监视单个属性值:
写法1:在Vue实例对象时配置:
 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root">
<!--通过插值表达式结合计算属性展示天气信息    --><h2>今天的天气:{{info}}</h2>
<!--绑定单击鼠标事件切换天气    --><button @click="changeWeather">点击切换天气</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {isHot: true}},//通过计算属性的函数展示天气信息computed: {info() {return this.isHot ? '炎热' : '凉爽';}},//通过单击鼠标事件的回调函数改变天气信息methods: {changeWeather() {this.isHot = !this.isHot;}},//监视isHot属性,当属性的值发生改变时,将改变前和改变后的值输出到控制台watch: {//监视属性isHot: {//在初始化时监视immediate:true,handler(newValue, oldValue) {console.log('新的数据:', newValue);console.log('旧的数据:', oldValue);}}}})vm.$mount("#root");
</script>
</body>
</html>

写法2:Vue实例对象完成后,配置监视属性
 <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root">
<!--通过插值表达式结合计算属性展示天气信息    --><h2>今天的天气:{{info}}</h2>
<!--绑定单击鼠标事件切换天气    --><button @click="changeWeather">点击切换天气</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {isHot: true}},//通过计算属性的函数展示天气信息computed: {info() {return this.isHot ? '炎热' : '凉爽';}},//通过单击鼠标事件的回调函数改变天气信息methods: {changeWeather() {this.isHot = !this.isHot;}}})//第二种写法  创建实例后 配置vm.$watch('isHot', {//在初始化时监视immediate: true,handler(newValue, oldValue) {console.log('新的数据:', newValue);console.log('旧的数据:', oldValue);}})vm.$mount("#root");
</script>
</body>
</html>

说明:配置监视属性必须要在Vum实例绑定div容器之前

测试结果展示:

因为我们在监视属性中配置了属性初始化时就开始监视,所以页面刚加载出来时,控制台就输出了相关信息,由于此时数据未改变,所以旧的值为unfined,表示未定义;

此时当我们单击按钮时,就会再次触发事件,引起监视的属性的改变,进而会执行监视属性中的逻辑

2.深度监视:
1.监视对象的一个属性:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root">
<!--通过插值表达式获取data中numbers的属性值    --><h3> a:的值是{{numbers.a}} </h3><h3> b:的值是{{numbers.b}} </h3>
<!--绑定单击鼠标事件,执行numbers的属性++操作(Vue 会自动将表达式执行的结果作为回调函数来处理,属于回调函数的简写)     --><button @click="numbers.a++">点击a++</button><button @click="numbers.b++">点击b++</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {numbers: {a: 1,b: 2}}},watch: {//单独的监视对象的一个属性'numbers.b': {handler(newValue, oldValue) {console.log(newValue,oldValue)}}}})vm.$mount("#root");
</script>
</body>
</html>

在上面案例中,我们对data属性中的numbers对象的b属性进行监视,当点击对应按钮时触发事件,改变了b属性的值,此时就会在监视属性中执行相关逻辑,控制台打印新旧数据;

2.监视整个对象:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root">
<!--通过插值表达式获取data中numbers的属性值    --><h3> a:的值是{{numbers.a}} </h3><h3> b:的值是{{numbers.b}} </h3>
<!--绑定单击鼠标事件,执行numbers的属性++操作(Vue 会自动将表达式执行的结果作为回调函数来处理,属于回调函数的简写)     --><button @click="numbers.a++">点击a++</button><button @click="numbers.b++">点击b++</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {numbers: {a: 1,b: 2}}},watch: {numbers: {//启用深度监视deep: true,handler(newValue,oldValue) {console.log(newValue,oldValue)}}}})vm.$mount("#root");
</script>
</body>
</html>

在上面案例中,我们对data属性中的numbers对象的b属性进行监视,当点击对应按钮时触发事件,改变了b属性的值,此时就会在监视属性中执行相关逻辑,控制台打印新旧数据。但实际上对于numbers对象而言,虽然b属性的值发生了改变,但numbers对象本身并没发生变化,因此新旧数值实际上是相同的;

3.监视属性的简写:只适用于单个属性等简单逻辑的监视

对于监视单个属性的简单逻辑,可以对监视属性的写法进行简化,示例代码如下:

  <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--2.准备一个容器-->
<div id="root"><h2>今天的天气:{{info}}</h2><button @click="changeWeather">点击切换天气</button>
</div>
<!--1.引入Vue js 文件-->
<script src="vue/vue.js"></script>
<script type="text/javascript">//3.创建Vue对象let vm = new Vue({data() {return {isHot: true}},computed: {info() {return this.isHot ? '炎热' : '凉爽';}},methods: {changeWeather() {this.isHot = !this.isHot;}},watch: {//监视属性'isHot'(newValue, oldValue) {console.log('新的数据:', newValue);console.log('旧的数据:', oldValue);}}})vm.$mount("#root");
</script>
</body>
</html>

注意:此种简写方式只适用于监视单个属性的简单逻辑,对于深度监视这种复杂逻辑则不适用。因为简写代码中监视属性中不再是一个对象,而是一个函数,在此函数中无法进行深度监视的配置;

4.总结:

  1. 1.当被监视的属性改变时,回调函数会自动执行。
  2. 2.监视的属性是必须存在
  3. 3.监视有两种写法
  •   在创建Vue实例时 配置 watch
    
  •   在创建Vue实例之后 配置监视
    

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门自学Day11-- String, Vector, List 复习

往期内容回顾 List类型的自实现 List类型&#xff08;初识&#xff09; Vector类的自实现 Vector类&#xff08;注意事项&#xff09; 初识Vector String类的自实现 String类的使用&#xff08;续&#xff09; String类&#xff08;续&#xff09; String类&#xff08;初识&…

JavaScript性能优化实战(三):DOM操作性能优化

想象一下&#xff0c;你正在精心布置一个豪华蛋糕&#xff08;你的网页&#xff09;&#xff0c;每次添加一颗草莓&#xff08;DOM元素&#xff09;都要把整个蛋糕从冰箱拿出来、放回去&#xff08;重排重绘&#xff09;&#xff0c;来来回回几十次&#xff0c;不仅效率低下&am…

【力扣】面试经典150题总结02-双指针、滑动窗口

1.验证回文串&#xff08;简单&#xff09;用toLowerCase()转为小写字母&#xff0c;然后前后指针向中间进行比对。2.判断子序列&#xff08;简单&#xff09;两个指针一个指向长字符串&#xff0c;另一个指向短字符串。匹配就都1&#xff0c;不匹配就将长字符串指针1。长字符串…

MQ迁移方案

以下是完整的MQ迁移方案设计&#xff0c;涵盖同构/异构迁移、零丢失保障、灰度切换等关键环节&#xff0c;适用于Kafka、RabbitMQ、RocketMQ等主流消息队列&#xff1a;​一、迁移方案选型矩阵​​场景​​适用方案​​技术实现​​优缺点​​同集群版本升级​滚动重启 协议兼…

RAG 分块中表格填补简明示例:Markdown、HTML、Excel、Doc

表格填补是RAG分块中常见的需求&#xff0c;但不同格式的表格处理方式有所不同。本文将对 Markdown、HTML、Excel 的合并单元格进行说明&#xff0c;并给出 Python 示例&#xff0c;演示如何解析和填补。1. Markdown 表格Markdown 只能用空值表示合并单元格。&#xff08;只有列…

IDEA创建一个VUE项目

由于新手学习VUE&#xff0c;所以使用手动初始化项目 步骤&#xff1a; 创建项目文件夹&#xff1a;在 IDEA 中点击 File > New > Project&#xff0c;选择 Empty Project&#xff0c;指定项目路径。初始化 npm&#xff1a;在终端中&#xff1a;npm init -y安装vue&#…

Chrome插件开发实战:todoList 插件

以下是一个适合小团队自用的 Chrome TodoList 插件开发示例&#xff0c;包含基础功能&#xff08;增删改查、本地存储、统计&#xff09;和简洁的交互设计。代码结构清晰&#xff0c;适合新手学习或快速上手。 一、项目准备 创建插件项目目录 todo-list-extension&#xff0c;…

【Redis数据库开启SSL加密】【小白指南】【生产环境可用】附带Docker服务器配置和python连接Redis数据库代码(加密通讯版)

【Redis数据库开启SSL加密】【填坑指南】附带服务器配置和python连接测试代码 本教程转为小白提供设置Redis安全访问&#xff0c;自签名证书进行安全访问你的Redis数据库&#xff0c;轻松实现安全访问和保护数据库不被非法入侵。 本文原创&#xff0c;转载请注明出处&#xff0…

笔记本电脑键盘失灵【已解决】

配置环境硬件详情笔记本电脑联想拯救者y7000 2019 PG0&#xff08;已更新为win11&#xff09;外接键盘colorful ckb-p100问题今天笔记本开机后&#xff0c;进入登录页面输入密码&#xff0c;突然发现笔记本自带键盘&#xff08;我通常不用外接键盘&#xff09;的键失灵了&#…

postgresql运维问题解决:PG集群备节点状态异常告警处理

小亦平台会持续给大家科普一些运维过程中常见的问题解决案例&#xff0c;运维朋友们可以在常见问题及解决方案专栏查看更多案例 问题概述&#xff1a; 故障&#xff1a; pg数据库备节点状态异常现象&#xff1a; 一般为集群间心跳超时导致,现象为集群有fail-count失败数告警&…

Maven 开发实践

文章目录1. 搭建私服&#xff08;windows)2.上传依赖3.多个远程仓库配置4.其它1. 搭建私服&#xff08;windows) 软件下载 https://help.sonatype.com/en/download.html修改端口 etc/nexus-default.properties启动程序 管理员身份进入进入bin目录下执行.\nexus.exe /run创建Ma…

设计心得——如何架构选型

一、架构的作用 可能对于很多的公司&#xff0c;其实架构本身的重要性并不大。大家一定明白这回事&#xff0c;架构在实际的开发&#xff0c;在大多数的场景下其实用处并没有书籍和资料中讲的那样重要&#xff0c;甚至是可有可无。这样讲是不有些可笑&#xff1f;是不是觉得挺意…

vba学习系列(12)--反射率通过率计算复杂度优化25/8/17

系列文章目录 文章目录系列文章目录前言一、反射率通过率1.整体通过率2.整体通过率3.客户工艺匹配4.机台通过率分析5.镜片通过率罩次分析分析1.1分析1.26.镜片通过率圈数分析分析1.1分析1.28.镜筒通过率圈数分析分析1.1分析1.29.镜筒通过率罩次分析分析1.2总结前言 一、反射率通…

Microsoft WebView2

运行效果 代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…

GitCode 疑难问题诊疗:全方位指南

一、问题诊断与解决框架1.1 通用问题排查流程在面对 GitCode 问题时&#xff0c;遵循一套科学的排查流程至关重要。首先&#xff0c;详细记录问题出现时的具体操作步骤与相关报错信息&#xff0c;这有助于精准定位问题根源。例如&#xff0c;若在执行git push命令时出现错误&am…

AMD Ryzen AI Max+ 395四机并联:大语言模型集群推理深度测试

本文介绍使用四块Framework主板构建AI推理集群的完整过程&#xff0c;并对其在大语言模型推理任务中的性能表现进行了系统性评估。该集群基于AMD Ryzen AI Max 395处理器&#xff0c;采用mini ITX规格设计&#xff0c;可部署在10英寸标准机架中。 Jeff Geerling大佬还开发了名…

深度学习·GFSS

GFSS General Few-Shot Segmentation 任务实现方式与zero-shot有所不同本篇论文只涉及同一个模态(图像)&#xff0c;训练过程中&#xff0c;novel class有几个图像提供&#xff0c;提供k个就称之为k-shot。先从图像中提取class prototype&#xff0c;然后这个原型向量作为查询&…

Transformer架构的数学本质:从注意力机制到大模型时代的技术内核

系列专栏推荐&#xff1a;零基础学Python&#xff1a;Python从0到100最新最全教程 深入浅出讲解神经网络原理与实现&#xff0c;从基础的多层感知机到前沿的Transformer架构。包含完整的数学推导、代码实现和工程优化技巧。 写在前面&#xff1a;为什么理解Transformer如此重要…

最新微信小程序一键获取真实微信头像和昵称方法

使用公开免费插件&#xff0c;快速实现获取用户头像和昵称&#xff0c;已附uniapp、微信开发工具开发详细教程。前言为了保护用户隐私&#xff0c;wx.getUserInfo、wx.getUserProfile都没法获取到用户头像和昵称了&#xff0c;只能通过设计用户主动选择/输入形式&#xff0c;操…

路由器配置之模式

文章目录配置路由器时&#xff0c;有一个模式选择最佳实践各个选项的区别11b only11g only11n only11bg mixed11bgn mixed配置路由器时&#xff0c;有一个模式选择 最佳实践 • 追求速度&#xff1a;选 11n only&#xff08;需所有设备支持&#xff09;。 • 兼容性优先&…