Vue2(二):计算属性、监视属性、二者的区别
一、计算属性
1. 使用插值语法和methods拼接姓名
如果样式要求不多的话这样写没问题,如下代码是截取我输入的姓的前三个字母
<div id="root">姓:<input type="text" v-moudel="firstName">名:<input type="text" v-moudel="lastName">姓名:<span>{{firstName.slice(0,3)}}-{{lastName}}</span></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{firstName:'hb',lastName:'bj'}})
样式太多的话就都放进methods里面去
注意:之前的showInfo是绑定事件,加不加()都行,现在是调用那个函数必须得加()
每次改动firstName后者lastName就会重新解析模版,调用fullName
<div id="root">姓:<input type="text" v-model="firstName">名:<input type="text" v-model="lastName">姓名:<span>{{fullName()}}</span></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{firstName:'hb',lastName:'bj'},methods:{fullName(){// this是vue实例,里面就有firstName啥的return this.firstName+'-'+this.lastName}}})
2. 使用计算属性拼接姓名
定义:要用的属性不存在,要通过Vue中已有属性计算得来。
原理:底层借助了Objcet.defineproperty方法提供的getter和setter
属性:vue认为data里面写的就是属性,属性:属性值,属性在vm._data里
计算属性:就是拿着你已经写完的属性去加工计算,放在vm里,不在data里
属性放在data里,计算属性放在computed
<div id="root">姓:<input type="text" v-model="firstName">名:<input type="text" v-model="lastName">姓名:<span>{{fullName}}</span>
姓名:<span>{{fullName}}</span>
姓名:<span>{{fullName}}</span></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{firstName:'hb',lastName:'bj'},computed:{fullName: {get(){//读取fullName的时候自动调用get// 并且vue给你设置computed里的this是vmconsole.log('get被调用喽')return this.firstName+'-'+this.lastName}}}})
如果这个时候我多次调用fullName的话,输出get被调用喽只显示一次,因为有缓存
get什么时候调用?(1)初次读取fullName 时,(2)所依赖的数据发生变化时,所以不用担心姓或者名变化fullName没变
我用computed不是fullName对象.get函数!而是我用fullName的时候立马就调用get函数,返回一个值放在fullName(计算出来的新属性)身上,在vm中可以查看
set什么时候调用?fullName被修改的时候,而且必须设置参数,你把fullName改成什么就返回什么
set(value){const arr=value.split('-')this.firstName=arr[0]this.lastName=arr[1]//fullName依赖first和last,想真正的改掉就得把谁算出来的改掉}
优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
备注:
1.计算属性最终会出现在vm上,直接读取使用即可,不用加括号,和methods区别一下子。
2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变,这很关键。
3. 计算属性的简写
计算属性一般不修改,确定只读不改就可以用简写
姓名:<span>{{fullName}}</span>
computed:{fullName(){return this.firstName+'-'+this.lastName}}
fullName是一个属性,不是一个方法,只不过是调用里面的getter,把返回值直接给了vm,所以直接{{fullName}}不可以加()!!
data的数据,methods的方法,computed的计算属性
二、监视属性
1. 天气切换案例
(1)利用插值语法和三元表达式
<div id="root"><h2>今天天气很{{isHot?'炎热':'凉爽'}}</h2><button>切换天气</button></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{isHot:true}})
(2)利用计算属性
<div id="root"><h2>今天天气很{{info}}</h2><button @click="change">切换天气</button></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{isHot:true},computed:{info(){return this.isHot?'炎热':'凉爽'// isHot不是computed里的找不到,所以得this,就是vue的}},methods:{change(){this.isHot=!this.isHot;}}})
不需要methods也可以这样写:
<button @click="isHot=!isHot">切换天气</button>
@xxx:yyy绑定事件的时候可以写一些简单的语句
2. 监视属性
(1)watch
watch:{isHot:{immediate:true,//初始化时让handler调用//当isHot发生改变时它就调用handler(newValue,oldValue){console.log('isHot改了',newValue,oldValue)}}}
用handler的时候同时返回两个参数newValue和oldValue
(2)vm.$watch
const vm=new Vue({el:'#root',data:{isHot:true},computed:{info(){return this.isHot?'炎热':'凉爽'// isHot不是computed里的找不到,所以得this,就是vue的}},})vm.$watch('isHot',{immediate:true,//初始化时让handler调用//当isHot发生改变时它就调用handler(newValue,oldValue){console.log('isHot改了',newValue,oldValue)}})
第一个参数是对象名,第二个参数是配置对象
区别:很明确坚实谁就写第一种,否则就写第二种
3. 深度监视
(1).Vue中的watch默认不监测对象内部值的改变(一层,如果监视那么对象地址不变就不变)。
(2).配置deep:true可以监测对象内部值改变(多层)。
(3).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!想要可以就要手动开启deep:true
(4).使用watch时根据数据的具体结构,决定是否采用深度监视。
<div id="root"><h3>a的值是:{{numbers.a}}</h3><button @click="numbers.a++">点我实现a+1</button><h3>b的值是:{{numbers.b}}</h3><button @click="numbers.b++">点我实现b+1</button></div><script type="text/javascript">new Vue({el:'#root',data:{isHot:true,numbers:{a:1,b:1}},watch:{//监视多级结构中某个属性的变化numbers:{//不加引号报错是因为本来就应该加引号写,有的中间不带.的简写了没加// 如果想要给b也加的话,一个一个写太麻烦了,但是发现直接给number加// 改变a或者bnumber都不输出,因为它没有深入的去看a或b的变化deep:true,//监视多级结构中所有属性的变化handler(){console.log('number改了')}}}})</script>
4.监视的简写形式
用简写的前提是不需要immediate也不需要deep
(1)watch写法
watch:{isHot(newValue,oldValue){console.log('isHot被改了')}}
(2)$watch写法
vm.$watch('isHot',function(newValue,oldValue){console.log('isHot被改了')})
三、watch对比computed
1.watch
<div id="root">姓:<input type="text" v-model="firstName">名: <input type="text" v-model="lastName">全名: <span>{{fullName}}</span></div><script type="text/javascript">new Vue({el:'#root',data:{firstName:'张',lastName:'三',fullName:'张-三'},watch:{firstName(newValue){this.fullName=newValue+'-'+this.lastName},lastName(newValue){this.fullName=this.firstName+'-'+newValue}}})
监视姓的同时还是监视名
2.computed
computed:{fullName: {get(){console.log('get被调用喽')return this.firstName+'-'+this.lastName}}}
加一下就完事了,但是computed计算属性里面不能开启异步任务去维护数据的,靠的就是返回值,watch就可以开延迟什么的。
firstName(newValue){setTimeout(()=>{this.fullName=newValue+'-'+this.lastName},1000)
总结:
1、computed能完成的功能,watch都可以完成。
2、watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
两个重要的小原则!
1、所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
2、所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象
相关文章:
Vue2(二):计算属性、监视属性、二者的区别
一、计算属性 1. 使用插值语法和methods拼接姓名 如果样式要求不多的话这样写没问题,如下代码是截取我输入的姓的前三个字母 <div id"root">姓:<input type"text" v-moudel"firstName">名:<…...
CTF题型 SSTI(2) Flask-SSTI典型题巩固
CTF题型 SSTI(2) Flask-SSTI典型题巩固 文章目录 CTF题型 SSTI(2) Flask-SSTI典型题巩固前记1.klf__sstiSSTI_Fuzz字典(网上收集自己补充) 2.klf_2数字问题如何解决了?|count |length都被禁? 3.klf_3 前记 从基础到自己构造paylo…...
计算机设计大赛 题目: 基于深度学习的疲劳驾驶检测 深度学习
文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 🔥 优…...
小字辈[天梯赛]
文章目录 题目描述思路AC代码 题目描述 思路 深度优先搜索 具体流程 1.读入每个人的祖先,标记辈分最高的老祖宗对应的下标pos 2.从pos开始dfs,每次判断当前遍历的深度,如果>原来的深度,更新,并将存储最小辈分的数组…...
Linux常用操作命令、端口、防火墙、磁盘与内存
目录 1.Linux常用操作命令 1.1 基本命令 1.2 高级命令 2.Linux防火墙 2.1 iptables 2.2 firewalld 3.Linux端口号 3.1 netstat(查看网络连接) 3.2 lsof(查找占用端口的进程) 3.3 ps(查看进程服务路径&#x…...
<JavaEE> 了解网络层协议 -- IP协议
目录 初识IP协议 什么是IP协议? IP协议中的基础概念 IP协议格式 图示 4bit版本号(version) 4bit头部长度(headerlength) 8bit服务类型(TypeOfService) 16bit总长度(total l…...
【安全类书籍-2】Web渗透测试:使用Kali Linux
目录 内容简介 作用 下载地址 内容简介 书籍的主要内容是指导读者如何运用Kali Linux这一专业的渗透测试平台对Web应用程序进行全面的安全测试。作者们从攻击者的视角出发,详细阐述了渗透测试的基本概念和技术,以及如何配置Kali Linux以适应渗透测试需求。书中不仅教授读者…...
ubuntu10.04 apache2.2开启tls1.2的支持,使现代的edge和firefox浏览器能正常访问https
最近发现自己ubuntu10.04服务器上的apache https无法通过win11上的edge和firefox浏览器访问,但xp下的ie6和ie8没有问题。 firefox的错误提示为“此网站可能不支持TLS 1.2协议,而这是Firefox支持的最低版本”。 经过检查发现: IE6访问https所需的版本是SS…...
算法学习(持续更新中)
学习视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)_哔哩哔哩_bilibili 时间复杂度 一个操…...
蓝桥杯 2023 省B 飞机降落
首先,这题要求的数据量比较少,我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑,比如说: 现在时间是10,有个飞机20才到,我们是可以干等10分钟。 #include <iostream> #include <…...
基于python的变配电室运行状态评估与预警系统flask-django-nodejs-php
近年来,随着我国工业化、城镇化步伐的不断加快,城市配电网络取得令人瞩目的发展成果。变配电室是供配电系统的核心,在供配电系统中占有特殊的重要地位[1]。变配电室电气设备运行状态和环境信息缺乏必要的监测评估预警手段,如有一日遭遇突发情…...
el-table左键双击单元格编辑内容(输入框输入计算公式可直接得出结果),右键单击展示操作菜单,可编辑单元格高亮展示
vue2点击左侧的树节点(el-tree)定位到对应右侧树形表格(el-table)的位置,树形表格懒加载 表格代码 <el-table ref"singleTable" :data"detailsList" highlight-current-row"" row-key"detailId"…...
实现HBase表和RDB表的转化(附Java源码资源)
实现HBase表和RDB表的转化 一、引入 转化为HBase表的三大来源:RDB Table、Client API、Files 如何构造通用性的代码模板实现向HBase表的转换,是一个值得考虑的问题。这篇文章着重讲解RDB表向HBase表的转换。 首先,我们需要分别构造rdb和hba…...
10:00面试,10:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
【Python】: Django Web开发实战(详细教程)
Python Django全面介绍 Django是一个非常强大的Python Web开发框架,它以"快速开发"和"干净、实用的设计"为设计宗旨。本文将从Django的基本概念开始,逐渐引导大家理解如何使用Django构建复杂的web应用程序。 Django基本概念与原理…...
突破编程_C++_C++11新特性(tuple)
1 std::tuple 简介 1.1 std::tuple 概述 std::tuple 是一个固定大小的不同类型值的集合,可以看作 std::pair 的泛化,即 std::pair 是 std::tuple 的一个特例,其长度受限为 2。与 C# 中的 tuple 类似,但 std::tuple 的功能更为强…...
xss.pwnfunction(DOM型XSS)靶场
环境进入该网站 Challenges (pwnfunction.com) 第一关:Ma Spaghet! 源码: <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(location).searchParams.get(somebody) || "Somebo…...
安装 docker 和 jenkins
安装 docker #安装 软件包 docker yum install -y yum-utils device-mapper-persistent-data lvm2#设置 yum 源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-c…...
jni入门学习 CMakeLists脚本
在 Android Studio 中使用 CMake 可以编译 C/C 代码,这为开发者提供了在 Android 应用中嵌入本地代码的能力。下面是关于在 Android Studio 中使用 CMake 编译的详细说明: 1. 创建 CMakeLists.txt 文件: 首先,你需要在项目的根目…...
如何在没有向量数据库的情况下使用知识图谱实现RAG
引言 传统上,为大型语言模型(LLMs)提供长期记忆通常涉及到使用检索增强生成(RAG)解决方案,其中向量数据库作为长期记忆的存储机制。然而,我们是否能在没有向量数据库的情况下达到相同效果呢&am…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...
OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...
Q1起重机指挥理论备考要点分析
Q1起重机指挥理论备考要点分析 一、考试重点内容概述 Q1起重机指挥理论考试主要包含三大核心模块:安全技术知识(占40%)、指挥信号规范(占30%)和法规标准(占30%)。考试采用百分制,8…...
