Vue2(生命周期,列表排序,计算属性和监听器)

目录

      • 前言
      • 一,生命周期
        • 1.1,生命周期函数简介
        • 1.2,Vue的初始化流程
        • 1.3,Vue的更新流程
        • 1.4, Vue的销毁流程
        • 1.5, 回顾生命周期
        • 1.,6,代码演示
          • 1.6-1,beforeCreate
          • 1.6-2,created
          • 1.6-3,beforeMount
          • 1.6-4,mounted
          • 1.6-5,beforeUpdate
          • 1.6-6,updated
        • 1.7,生命周期函数的使用场景
      • 二,vue中列表排序
        • 2.1,vue中数据更新的问题
          • 2.1-1,对象新增数据更新问题
          • 2.1-1,数组数据更新问题
      • 三,计算属性computed
      • 四,监视属性watch
      • 最后

前言

上一章博客我们讲解了Vue基础
这一章我们来讲Vue生命周期,列表过滤,计算属性和监听器

一,生命周期

  • 通常也叫生命周期回调函数、生命周期函数、生命周期钩子
  • vue初始化时在不同的阶段调用的不同函数
  • 生命周期函数的this指向为vue实例,名字不能更改

1.1,生命周期函数简介

“生命周期”指实例对象从构造函数开始执行(被创建)到被GC(Garbage Collection)回收销毁的整个存在的时期
生命周期函数是为了在实例对象的各个阶段方便开发者控制而产生,在不同的时期有不同的生命周期函数,可以利用不同时期的生命周期函数去完成不同的操作

实际的开发过程中,生命周期函数的使用较为频繁,需要重点掌

1.2,Vue的初始化流程

在这里插入图片描述

  • beforeCreate阶段
    • vue中data的数据和methods的方法还不能使用
  • created阶段
    • vue中data的数据和methods的方法已可以使用
  • beforeMount阶段
    • 页面可以展示内容,但是是未编译,最终都是不能操作的DOM结构,展示时间短
  • mounted
    • 页面显示编译后的DOM
    • vue的初始化过程结束
    • 此阶段可进行:定时器、网络请求、订阅消息、绑定事件等

1.3,Vue的更新流程

在这里插入图片描述

  • beforeUpdate
    • 数据是新的,页面还没有更新
  • Updated
    • 数据是新的,页面同步更新

1.4, Vue的销毁流程

在这里插入图片描述

  • beforeDestroy
    • 此阶段可关闭定时器和取消订阅
    • 数据、方法可以访问但是不触发更新
  • destroy
    • 一切都结束了

1.5, 回顾生命周期

  • 生命周期函数
    • 创建前、创建后(beforeCreate、created)
    • 挂载前、挂载后(beforeMount、mounted)
    • 更新前、更新后(beforeUpdate、updated)
    • 销毁前、销毁后(beforeDestroy、destroyed)
  • 常用的生命周期函数
    • mounted
      • 开启定时器
      • 发送ajax请求
      • 订阅消息
      • 绑定自定义事件
    • beforeDestroy
      • 清除定时器
      • 取消订阅、事件监听
      • 解绑自定义事件
  • vue实例销毁
    • vue开发者工具的数据为空
    • 销毁后自定义事件失效
    • 不要在beforeDestroy进行数据的操作,不会再走更新流程

1.,6,代码演示

1.6-1,beforeCreate
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app">{{myName}}</div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{myName:"abc"}},beforeCreate(){var bobyDom = document.getElementsByTagName("body")[0].innerHTML// beforeCreate中,data的数据是没有被定义的console.log("beforeCreate",this.myName,bobyDom);},})
</script>
</html>

在这里插入图片描述

1.6-2,created
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app">{{myName}}</div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{myName:"abc"}},created(){var bobyDom = document.getElementsByTagName("body")[0].innerHTML// 做一下页面的数据初始化工作。比如说发起ajax请求console.log("created",this.myName,bobyDom);},})
</script>
</html>

在这里插入图片描述

1.6-3,beforeMount
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app">{{myName}}</div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{myName:"abc"}},beforeMount(){var bobyDom = document.getElementsByTagName("body")[0].innerHTMLconsole.log("beforeMount",this.myName,bobyDom);},})
</script>
</html>

在这里插入图片描述

1.6-4,mounted
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app">{{myName}}</div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{myName:"abc"}},mounted(){var bobyDom = document.getElementsByTagName("body")[0].innerHTML// 数据已经渲染到View中console.log("mounted",this.myName,bobyDom);},})
</script>
</html>

在这里插入图片描述

1.6-5,beforeUpdate
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app">{{myName}}</div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{myName:"abc"}},beforeUpdate(){var bobyDom = document.getElementsByTagName("body")[0].innerHTML// 数据更新前,数据未改变console.log("beforeUpdate",this.myName,bobyDom);},})
</script>
</html>

在这里插入图片描述

1.6-6,updated
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app">{{myName}}</div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{myName:"abc"}},updated(){var bobyDom = document.getElementsByTagName("body")[0].innerHTML// 数据更新后,数据已改变console.log("updated",this.myName,bobyDom);}})
</script>
</html>

在这里插入图片描述

1.7,生命周期函数的使用场景

  • 在beforeCreate生命周期函数运行时,可以添加loading动画
  • 在created生命周期函数运行时,可以结束loading动画,还可以做一些初始化,实现函数自执行等操作
  • 最经常使用的是mounted生命周期函数
    • 可以发起后端数据请求,取回数据
    • 可以接收页面之间传递的参数
    • 可以子组件向父组件传递参数等

二,vue中列表排序

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div><input type="text" v-model="searchInput" name="" id=""><button @click="paixu(1)">升序</button><button @click="paixu(2)">降序</button><button @click="paixu(3)">原序列</button><div v-for="(item,index) in searchList">{{item.name}}--{{item.price}}</div></div></div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:'#app',data(){return{keyword:0, // 用来排序searchInput:"",goodList:[{name:'牛仔裤',price:200},{name:'运动鞋',price:100},{name:'跑步鞋',price:300},{name:'篮球鞋',price:400},],}},methods:{paixu(val){this.keyword=val}},computed:{searchList(){// 把goodList的内容过滤,把符合条件的形成一个新的数组// filter是数字的过滤方法,这个方法的参数是一个函数,此函数返回true,则把此项返回新的数组中let list = this.goodList.filter((item)=>{return item.name.indexOf(this.searchInput)!==-1})if(this.keyword){list.sort((a1,a2)=>{return this.keyword === 1? a1.price - a2.price: a2.price - a1.price})}return list}}})
</script>
</html>

在这里插入图片描述

2.1,vue中数据更新的问题

2.1-1,对象新增数据更新问题
  • 描述
    • 通过普通对象添加属性方法,Vue不能监测到且不是响应式
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div v-for="(attr,key) in person">{{key}} -- {{attr}}</div></div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:'#app',data(){return{person:{name:'张三',sex:'男',}}},})
</script>
</html>

在这里插入图片描述
这样添加它没有没有跟对象一样封装有监测数据变化的getter、setter

  • 解决
    • Vue.set() / this.$set
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div v-for="(attr,key) in person">{{key}} -- {{attr}}</div></div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:'#app',data(){return{person:{name:'张三',sex:'男',}}},})
</script>
</html>

在这里插入图片描述

  • 注意
    • this.$set不能给vue实例的根数据对象添加属性
2.1-1,数组数据更新问题
  • 描述
    • 直接通过数组索引值改变数组的数据,Vue监测不到改变
    • 实际在 js 内存已经把数据的第一项数据修改了
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div v-for="(attr,key) in person">{{key}} -- {{attr}}</div><div><input type="text" v-model="searchInput" name="" id=""><button @click="paixu(1)">升序</button><button @click="paixu(2)">降序</button><button @click="paixu(3)">原序列</button><div v-for="(item,index) in searchList">{{item.name}}--{{item.price}}</div></div></div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:'#app',data(){return{keyword:0, // 用来排序searchInput:"",goodList:[{name:'牛仔裤',price:200},{name:'运动鞋',price:100},{name:'跑步鞋',price:300},{name:'篮球鞋',price:400},],person:{name:'张三',sex:'男',}}},methods:{paixu(val){this.keyword=val}},computed:{searchList(){// 把goodList的内容过滤,把符合条件的形成一个新的数组// filter是数字的过滤方法,这个方法的参数是一个函数,此函数返回true,则把此项返回新的数组中let list = this.goodList.filter((item)=>{return item.name.indexOf(this.searchInput)!==-1})if(this.keyword){list.sort((a1,a2)=>{return this.keyword === 1? a1.price - a2.price: a2.price - a1.price})}return list}}})
</script>
</html>

在这里插入图片描述

  • 原因
    • 因为在vue中数组并没有跟对象一样封装有监测数据变化的getter、setter
  • 解决
    • Vue在数组的原始操作方法上包裹了重新解析模板的方法,也就是说我们在data里面的数组操作方法不是原生的,是vue封装过的
    • 哪些数组操作方法经过了封装?
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
pop() 删除数组的最后一个元素并返回删除的元素
shift()  删除并返回数组的第一个元素
unshift()  向数组的开头添加一个或更多元素,并返回新的长度。
splice()  从数组中添加或删除元素。
sort()   对数组的元素进行排序
reverse() 反转数组的元素顺序。

三,计算属性computed

计算属性,方法名可以直接在对象中使用.这个属性是通过计算得出的。
这个方法中的任意属性改变,都会触发这个方法
使用场景:希望把一些计算的业务逻辑放在方法中,例如:全名计算、地址计算、购物车合计

下面的示例,我们使用了三种方式:

  • 使用方法实现
  • 使用vue的computed读写方式实现
  • 使用vue的computed只读方式实现

注意:推荐使用computed的方式。有缓存机制。在页面重复调用多次的情况下,只执行一次

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div><input type="text" v-model="firstName" ><br><input type="text" v-model="lastName" ><br><input type="text" v-model="getFullName()" ><br><input type="text" v-model="fullNameReadOnly" ><br><input type="text" v-model="funName" ><br></div></div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{firstName:'科比',lastName:'布莱恩特',}},methods:{getFullName(){return this.firstName + "-" + this.lastName}},computed:{// 只读方式的简写fullNameReadOnly(){return this.firstName + "-" + this.lastName},funName:{get(){return this.firstName + "-" + this.lastName},set(value){this.firstName = value.split("-")[0]this.lastName = value.split("-")[1]}}},})
</script>
</html>

在这里插入图片描述

四,监视属性watch

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"></div>
</body>
<script src="../js/vue2.7.js"></script>
<script>var app = new Vue({el:"#app",data(){return{isSunny:true,person:{age:18,name:'王导',}}},watch:{// 表示要对isSunny这个属性进行监听isSunny(newVal,oldVal){console.log("改变了",oldVal,newVal);},// 深度监听可以用来监听整个对象的改变,但要慎重使用,因为消耗性能 person:{deep:true,handler(oldVal,newVal){console.log("改变了",oldVal,newVal);}},"person.name"(oldVal,newVal){console.log("我也监听了");}}})
</script>
</html>

在这里插入图片描述

最后

送大家一句话: 世界上的好东西都是抢来的,只有弱者才会坐等分配

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

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

相关文章

Python爬虫异常处理心得:应对网络故障和资源消耗

作为一名专业的爬虫代理&#xff0c;我知道在爬取数据的过程中&#xff0c;遇到网络故障和资源消耗问题是再正常不过了。今天&#xff0c;我将与大家分享一些关于如何处理这些异常情况的心得和技巧。不论你是在处理网络不稳定还是资源消耗过大的问题&#xff0c;这些技巧能够帮…

CMake良心教程(1)手把手教你入门!

目录 一.CMake是什么&#xff1f;有什么用&#xff1f; 二.环境配置 2.1CMake安装 2.2MinWG安装 三.构建最小项目 3.1项目的构建 3.2外部构建与内部构建 四.CMakeLists.txt语法介绍 4.1 project关键字 4.2 set 与 PROJECT_NAME 4.3 MESSAGE关键字 4.4 ADD_EXECUTABL…

安全防护,保障企业图文档安全的有效方法

随着企业现在数据量的不断增加和数据泄露事件的频发&#xff0c;图文档的安全性成为了企业必须高度关注的问题。传统的纸质文件存储方式已不适应现代企业的需求&#xff0c;而在线图文档管理成为了更加安全可靠的数字化解决方案。那么在在线图文档管理中&#xff0c;如何采取有…

【流量、日志分析】常见的web流量分析、windows日志分析

1.web流量分析 1.1 特点 通常会提供一个包含流量数据的 PCAP 文件&#xff0c;有时候也会需要先进行修复或重构传输文件后&#xff0c;再进行分析。 复杂的地方在于数据包里充满着大量无关的流量信息&#xff0c;因此如何分类和过滤数据是我们需要做的。 1.2 流量包修复 例…

计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D

《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis》 摘要 我们见证了3D感知图像合成的快速进展&#xff0c;利用了生成视觉模型和神经渲染的最新进展。然而&#xff0c;现有的方法在两方面存在不足&#xff1a;首先&#xff0c;它们…

18. SpringBoot 如何在 POM 中引入本地 JAR 包

❤️ 个人主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;成功解决 BUG 合集 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; Spring Boot 是一种基于 Spring 框架的轻量级应用程序开发框架&#xff0c;它提供了快速开发应用程…

06 为什么需要多线程;多线程的优缺点;程序 进程 线程之间的关系;进程和线程之间的区别

为什么需要多线程 CPU、内存、IO之间的性能差异巨大多核心CPU的发展线程的本质是增加一个可以执行代码工人 多线程的优点 多个执行流&#xff0c;并行执行。&#xff08;多个工人&#xff0c;干不一样的活&#xff09; 多线程的缺点 上下文切换慢&#xff0c;切换上下文典型值…

Android LinearLayout dynamic add child ImageView,Glide load,kotlin

Android LinearLayout dynamic add child ImageView&#xff0c;Glide load&#xff0c;kotlin images.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"andro…

宋浩概率论笔记(二)随机变量

本章节内容较多&#xff0c;是概率论与数理统计中最为重要的章节&#xff0c;对于概率密度和分布函数的理解与计算要牢牢掌握&#xff0c;才能在后期的学习中更得心应手。

前端js--剪刀石头布

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><linkrel"stylesheet"href"ht…

libcurl网络库的函数接口使用

文章目录 1、libcurl简介2、libcurl的使用3、函数简介4、 curl_easy_setopt函数部分选项介绍5、curl_easy_perform 函数说明&#xff08;error 状态码&#xff09;6、简单实例,包含库文件&#xff0c;头文件即可 1、libcurl简介 libcurl是一个跨平台的网络协议库&#xff0c;支…

Running Homebrew as root is extremely dangerous and no longer supported

Running Homebrew as root is extremely dangerous and no longer supported 查看磁盘所有信息 在使用homebrew安装smartmontools&#xff0c;查看Mac磁盘信息&#xff0c;包括mac磁盘写入量、mac磁盘健康、磁盘启动次数等&#xff0c;遇到的问题及解决方案 使用brew install s…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明&#xff1a; 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

Django的FBV和CBV

Django的FBV和CBV 基于django开发项目时&#xff0c;对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…

xcode打包导出ipa

转载&#xff1a;xcode打包导出ipa 目录 转载&#xff1a;xcode打包导出ipa 第一步&#xff1a;注册苹果开发者账号 第二步&#xff1a;下载APP Uploader 第三步&#xff1a;使用xcode打包导出ipa文件&#xff0c;供其他人内测 众所周知&#xff0c;在开发苹果应用时需要使…

通达信上涨回调选股公式,趋势指标和摆动指标结合使用

在前面的文章中&#xff0c;介绍了赫尔均线 (HMA)和随机RSI(StochRSI)&#xff0c;这两个指标分别属于趋势指标和摆动指标。趋势指标和摆动指标是技术分析中常用的两类指标&#xff0c;用于分析市场的走势和波动&#xff0c;它们的计算方法、应用场景都是有区别的。今天利用两类…

PowerDesigner数据库设计工具使用笔记

简单记录下这个数据库设计工具的使用&#xff0c;在开发中设计数据库过程用得上&#xff0c;好记性不如烂笔头Q 显示窗口 PowerDesigner的工具箱原来叫palette&#xff0c;现在叫Toolbox&#xff0c;大概是PowerDesigner 16版本更名的 工具类View >ToolBox 即可 选择数据…

学术资源加速

以下为可以加速访问的学术资源地址&#xff1a; github.comgithubusercontent.comgithubassets.comhuggingface.co 编辑 /etc/network_turbo vim /etc/network_turbo 内容格式参考如下&#xff1a; export no_proxylocalhost,127.0.0.1 export http_proxyhttp://127.0.0.…

pom文件---maven

027-Maven 命令行-实验四-生成 Web 工程-执行生成_ev_哔哩哔哩_bilibili 27节.后续补充 一.maven下载安装及配置 1)maven下载 2) settings文件配置本地仓库 3)settings配置远程仓库地址 4)配置maven工程的基础JDK版本 5)确认JDK环境变量配置没问题,配置maven的环境变量 验证…

GD32F103VE外部中断

GD32F103VE外部中断线线0~15&#xff0c;对应外部IO口的输入中断。它有7个中断向量&#xff0c;外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量&#xff1b;外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量&#xff1b;外部中断线10~15 共用一个 EXTI15_10_IRQn中断…