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…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
