【vue】生命周期,组件,插槽,依赖注入,实现分页器组件,异步组件,keep-alive

news2024/11/25 16:22:49

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 生命周期
  • 总结
  • 组件
    • 例子
    • 轮播图组件
  • 在组件中使用v-model
  • Mixin
  • 插槽
    • 具名插槽
    • 实现一个分页器
  • 依赖注入
  • 异步组件
  • keep-alive

生命周期

  • 每个Vue组件实例在创建时候都需要经历一系列的初始化步骤
    首先是运行一个setup函数,然后是beforeCreate,然后初始化Options api,也就是所谓vue中例如data中的数据,该初始化的初始化,该读的读,vue2中把数据转成getter和setter等等 ,把computed里面的函数都改成getter字段
    在这里插入图片描述
  • 然后调用created函数,之后会询问有没有预编译好的模板,也就是所谓的脚手架,如果有编译好的模板就不用编译了,如果没有预编译模板需要自己编译,耗时。vue2中最终生成outerHTML,vue3中是InnerHTML ,根据编译模板之后会得到一个模板函数,也就是所谓的render函数,返回vnodetree
    在这里插入图片描述
  • 之后会执行beforeMount函数,然后初始渲染,根据vnodetree,真正创建一个DOM树,并塞到浏览器中
    在这里插入图片描述
  • 然后mounted调用,挂载成功了,称为了Mounted状态,当数据发生变化的时候,先执行beforeUpdate函数,然后重新渲染,生成新的虚拟DOM树,然后根据虚拟DOM树,利用diff算法,在真实的DOM树上进行打补丁,让虚拟DOM和真的DOM树形态一样,之后运行updated
    在这里插入图片描述
  • 当组件也unmounted的时候,之后会调用beforeUnmount和unmounted函数
    在这里插入图片描述

总结

  • 什么是Vue的options?就是new Vue({})时传入的这个对象,用来配置该vue实例的各个方面,常见字段有data,methods,computed等,声明组件的时候也用到的是同样的options对象:Vue.component(‘foo-bar’,{}),export default{}
  • vue能够检测数据变化的原理?vue2中是将数据及computed等字段都变成了getter和setter,业务代码修改数据相当于调用setter,setter里就会安排更新。它在我们提供的数据对象(data字段)上,递归的调用Object.defineProperty把那个对象的每个属性及深层次属性都变成getter/setter,这里没有对数据的下标进行getter,setter化,所以对下标的直接赋值是不能被检测到的,需要调用ary.splice等方法,或者Vue.$set(obj,key,value)也可以实现,同时,Vue还替换了数组的原型,以让从数组上访问到push,pop等变更方法的同时,也能检测到更新;vue3中是利用ES6 的Proxy对象来监控数据的变化,Proxy能够拦截对一个对象的几乎所有的操作,如读取,写入,判断属性的存在性,调用等等
  • 何为响应式效果?即业务代码对数据做出更新/修改后,vue能自动检测到并去执行dom的更新
  • 为什么为data字段中新增的属性没有响应式效果?通过obj.a = val这种方式自主添加的属性,不会成为getter/setter,自然也就检测不到了,Vue.set(obj,‘a’,value)写法会将a属性添加并设置为getter/setter
  • computed字段一般用在什么场景下?由现有数据推算/派生出来的数据时,将这些数据的计算声明为计算属性,可以极大的方便在模板中的使用。
  • 什么是vue的批量更新?业务代码中对数据做多次连续的变化,vue只做一次虚拟DOM的render,也只做一次真实DOM的更新。具体执行步骤:执行数据变更操作,并将变更操作推入微任务队列。当当前任务执行完毕后,浏览器会开始执行微任务队列中的任务。Vue会遍历微任务队列,并依次执行队列中的任务,进行批量更新。在更新过程中,Vue会根据实际的变更情况,对虚拟DOM进行比对(diff算法),找出需要更新的节点,并进行相应的DOM操作。使用微任务机制可以确保在同一事件循环中的多次数据变更都能被合并为一次更新,从而减少DOM操作的次数,提高性能和用户体验。
  • vue选项中的methods字段中的函数能使用箭头函数吗?能是能,但是用了箭头函数this的绑定就失效了,因为vue会自动将methods里的函数的this绑定到当前组件实例,而箭头函数的this是静态的,不能被绑定而改变。
  • 为什么data字段不能直接写对象而要写函数?在vue2中声明组件的时候,data字段必须为函数,不能为对象。因为组件最终有可能被创建多个实例,而每个实例之间不该有关联,所以data也不应该使用同一份。那为什么不能声明成对象,vue给复制出多份?声明成函数,函数不调用,一份也没有,节省内存;声明成对象,就算组件不实例化,数据也要占一份的空间,如果组件被多次实例化,则数据应该有多份,则vue需要复制它,但并不是所有的对象都能够被轻松复制,想要复制这个对象,得先认识这个对象,例如数组需要循环,对象需要forof等等,无法保证正确复制所有对象。所以提供一个函数,自己构建并返回数据。
  • 什么是虚拟DOM?为什么有时候它不会更新?就是各现代框架中用来表示DOM树的一种更轻量的数据结构,其实就是递归的对象,其中记录了如标签名,属性集合,事件集合,样式集合,子节点等信息,框架通过虚拟DOM来表示真实DOM,以达到节省内存以及快速对比的目的。当框架运行时候,在两次虚拟DOM的对比中,没有变化的部分,框架是不会去更新对应真实DOM中的结点的,如果用户以其他方式修改了DOM,但是这件事情在虚拟DOM中没有体现,则可能出现不更新的情况
  • proxy是什么?是ES6新增的一个class,利用它可以对一个对象的各种操作进行拦截,以实现对对象的监控,p = new Proxy(targetObject,{ get(){} set(){} has(){} apply(){} construct(){}})
  • 什么叫生命周期函数?vue2和vue3分别由哪些生命周期函数?一个复杂的对象在创建,运行,到最后的销毁的整个过程中,有着各个比较关键的时间点,在这些时间点会为使用者提供调用特定函数的机会,这些在特定时间点被调用的函数,被称作生命周期函数。
  • 组件化是什么意思?通过一些方案,可以使用更高层次的标签来画页面
  • 模块化是什么意思?不同代码写进不同文件,可以随时引入。
  • v-model本质是什么?text:value,input ; checked:checked,change
  • 什么是双向绑定?即页面中的一个可交互元素(往往是表单元素)与代码中的一个字段相互绑定,修改该字段,该表单元素会发生变化,通过表单元素进行鼠标或键盘输入,代码中对应的字段的值也会同步发生变化

组件

  • 子组件不能修改父组件的值,是单项数据流的

例子

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="container">
      <counter></counter>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      Vue.component("counter", {
        template: `
          <span>
            <button @click="current--">-</button>
            <span>{{current}}</span>
            <button @click="current++">+</button>
          </span>
        `,
        data() {
          return {
            current: 0,
          };
        },
      });

      new Vue({
        el: "#container",
      });
    </script>
  </body>
</html>

轮播图组件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="container">
      <slider
        :imgs="['https://travel.12306.cn/imgs/resources/uploadfiles/images/243945e6-c45d-4870-9cf5-77e488068646_product_W572_H370.jpg','https://travel.12306.cn/imgs/resources/uploadfiles/images/fcd7173f-7651-46e7-a126-bdc199e1f6f7_product_W572_H370.jpg','https://travel.12306.cn/imgs/resources/uploadfiles/images/b0c76b21-531b-4af4-a607-cf5672c72ded_product_W572_H370.jpg']"
        :buttons="true"
        :indicators="false"
      ></slider>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      Vue.component("slider", {
        template: `
          <div style="border:1px solid;width:400px;height:300px;position:relative;">
            <img :src="imgs[currentIndex]" style="width:100%;height:100%">
            <button v-if="buttons" @click="prev" style="position:absolute;top:50%;left:0;transform:translateX(-50%);"><</button>
            <button v-if="buttons" @click="next" style="position:absolute;top:50%;right:0;transform:translateX(-50%);">></button>
            <ul style="gap:5px;list-style:none;position:absolute;bottom:5px;display:flex;left:50%;transform:translate(-50%)">
              <li v-if="indicators" @click="currentIndex = index" v-for="(img,index) of imgs" :style="{backgroundColor: index === currentIndex ? 'red' : 'white'}" style="width:5px;height:5px;border:1px solid;border-radius:9999px"></li>
            </ul>
          </div>
        `,
        data() {
          return {
            currentIndex: 0,
          };
        },
        props: ["imgs", "buttons", "indicators"],
        methods: {
          prev() {
            this.currentIndex--;
            if (this.currentIndex === -1) {
              this.currentIndex = this.imgs.length - 1;
            }
          },
          next() {
            this.currentIndex++;
            if (this.currentIndex == this.imgs.length) {
              this.currentIndex = 0;
            }
          },
        },
      });

      new Vue({
        el: "#container",
        data: {},
      });
    </script>
  </body>
</html>

在组件中使用v-model

  • 组件标签之间的东西,会出现在组件模板的slot插槽中显示

  • vue3中在组件中使用v-model
    -
    这个就相当于<CustomInput v-model:‘searchText’>,默认绑定绑定的属性名字叫modelValue,事件叫update:modelValue

  • 因此我们这样写,在这里插入图片描述,emit事件写成update:modelValue,然后修改modelValue的传回去,就实现了v-model、

  • v-model传入的默认值是modelValue,如果向改变名字,就v-model:xxx=”title",改变xxx的值就可以了

Mixin

  • 当组件和组件之间存在相同的代码逻辑,我们希望对相同的代码逻辑进行抽取,通过Mixin
    在这里插入图片描述

插槽

具名插槽

  • < slot name="title " >,用的时候就直接< template #title>就可以了

实现一个分页器

分页器组件

依赖注入

  • 如果有一种情况,要套很多层组件,我们不能一层一层传递数据,这样会太麻烦了,出现了依赖注入
    父级组件这么写
    在这里插入图片描述
    也可以写成一个函数
    在这里插入图片描述
    子组件这么写

    在这里插入图片描述
    在这里插入图片描述

异步组件

  • 当应用包含大量组件时,一次性加载所有组件可能会导致初始加载时间变长,影响用户体验。异步组件通过将组件的加载延迟到需要时再进行加载,可以有效地减少初始加载时间,并且只在需要时才加载相应的组件。
  • 使用异步组件可以将组件的加载与应用的其他部分解耦,只有在组件真正需要时才加载,而不是在应用初始化阶段加载所有组件。这样可以避免不必要的网络请求和资源加载,提高应用的性能。
  • vue3中提供了defineAsyncComponent

在这里插入图片描述

  • Suspense 组件
    假如Dashboard组件没有加载完,就先加载下面那个loading具名插槽,当Dashboard加载完之后,下面的具名插槽就会消失,但是Suspense没有错误处理,外面包一个onErrorCaptured()钩子函数进行捕获和处理异步错误
    在这里插入图片描述

keep-alive

  • 作为keep-alive的子组件,实例是不会销毁的,会记录切换之前的状态
    在这里插入图片描述

————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件测试】软件测试总结笔记(1)

软件测试理论总结 1.Introduction1.1 What is Software Bug1.2 Tester的职责和目标其他概念软件测试的分类 2.软件开发生命周期Software Development ProcessSoftware Development Lifecycle ModelsTDD - Test-Driven Development测试驱动开发&#xff08;一种敏捷开发&#x…

城市微博签到数据分享地址解码与纠偏教程

收录于合集 #开源4个 #GIS34个 #社交媒体2个 #大数据4个 哈喽大家好&#xff0c;我又来啦&#xff01;最近一直有小伙伴私戳问我要 签到数据&#xff0c;本着 开源共享的精神&#xff0c;我这次给大家分享中国多个城市2022年9月的匿名签到数据&#xff0c;欢迎大家点击在看…

用Python做兼职,轻松赚取零花钱,分享Python兼职经验

文章目录 前言一、技术方案二、接单流程三、注意事项四、总结 前言 某家电商公司需要从竞争对手的网站上获取商品信息&#xff0c;以便更好地了解市场情况和竞争对手的策略。由于该公司没有专门的技术团队&#xff0c;因此他们需要找一家专业的爬虫服务公司来帮助他们完成这项…

冈萨雷斯DIP第4章知识点

文章目录 4.1 背景4.3 取样和取样函数的傅里叶变换4.5 二变量函数的傅里叶变换4.6 二维 DFT 和 IDFT 的一些性质4.6.6 二维离散卷积定理 4.7 频率域滤波基础4.7.3 频率域滤波步骤小结4.7.4 空间域和频率域滤波之间的对应关系 4.8 使用低通频率域滤波器平滑图像4.9 使用高通滤波…

Nacos作为服务注册中心简单示例

一、服务注册与发现场景 主要包含两个服务&#xff1a; zhshl-order服务: 作为服务消费者zhsl-stock服务: 作为服务提供者 当我们启用服务发现的时候,需要进行的操作主要有三步 0、前置条件,需要先搭建好一个nacas服务&#xff0c;可以是一个集群或者是单个nacos服务。可以…

MySQL 数据定义语言 DDL

文章目录 数据定义语言 DDL表的设计范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09; 创建表修改表删除表截断表 数据定义语言 DDL 前面我们学习的 DML 语言&#xff0c;主要实现对数据的增、删、改等基本操作…

零基础入门网络安全必看的5本书籍(附书单pdf)

作为一个Java转行网络安全的过来人&#xff0c;我深知自学时的种种不易&#xff0c;同时也经常有粉丝朋友问我&#xff1a;刚入门应该怎么学、有哪些书籍推荐等问题&#xff0c;今天我就把我自己的学习书单分享给大家&#xff0c;希望对大家有帮助&#xff01; 一、5本必读书籍…

JVM垃圾回收——对象进入老年代

目录 1、什么是大对象以及大对象对垃圾回收的影响 2、什么情况下对象会进入老年代 2.1 当创建对象的大小超过-XX:PretenureSizeThreshold的设定值 2.2 长期存活的对象将进入老年代 2.3 动态年龄判定 2.4 空间担保分配 什么是空间分配担保&#xff1f; 为什么要…

uploads靶场通关(1-11关)

Pass-01&#xff08;JS校验&#xff09; 看题目我们准备好我们的php脚本文件&#xff0c;命名为1.php 上传该php文件&#xff0c;发现上传失败 方法一&#xff1a;将浏览器的JavaScript禁用 然后就能上传了 方法二&#xff1a; 查看源码&#xff0c;发现只能上传以下形式的文…

【Docker】LXC所实现的隔离性、Linux Namespace等讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

域名解析异常有哪些办法?如何实现动态域名解析?

什么是域名解析&#xff1f; 域名解析就是把域名解析成一个ip地址&#xff0c;我们大多数人都喜欢记忆域名&#xff0c;但是机器只认识IP地址&#xff0c;只要这个IP地址对应相关域名&#xff0c;这就叫域名解析。 工作中常会遇到域名解析故障&#xff0c;比如访问站点对应的…

FPGA问答系列--Vivado Schematic中的实线和虚线有什么区别?

FPGA问答系列–Vivado Schematic中的实线和虚线有什么区别&#xff1f; 前言&#xff1a;本文章为FPGA问答系列&#xff0c;我们会定期整理FPGA交流群&#xff08;包括其他FPGA博主的群&#xff09;里面有价值的问题&#xff0c;并汇总成文章&#xff0c;如果问题多的话就每周…

ChatPPT一键制作PPT,效果拉满!

&#x1f4a7; C h a t P P T 一键制作 P P T &#xff0c;效果拉满&#xff01; \color{#FF1493}{ChatPPT一键制作PPT&#xff0c;效果拉满&#xff01;} ChatPPT一键制作PPT&#xff0c;效果拉满&#xff01;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我…

阿里云nginx配置https踩坑(配置完后访问显示无法访问此网站)

本人小前端一枚&#xff0c;最近在玩服务器部署自己的东西时踩了个坑&#xff01;&#xff01;&#xff01; server {listen 443 ssl;server_name localhost;ssl_certificate 证书.com.pem;ssl_certificate_key 证书.com.key;#后台管理静态资源存放location / { #文件目…

2023-06-04 Unity ScriptableObject2——ScriptableObject 的应用

文章目录 一、配置数据二、复用数据三、多态特性的利用四、单例模式获取数据 一、配置数据 ​ ScriptableObject 数据文件非常适合用来做配置文件&#xff1a; 配置文件的数据在游戏发布之前定规则配置文件的数据在游戏运行时只会读出来使用&#xff0c;不会改变内容在 Unity…

MPS|如何学习电路设计?帮你快速上手

​电路设计是电子工程中的重要领域之一&#xff0c;涉及到电子元件的选择、电路的设计和分析、电路板的制作等多个方面。对于初学者来说&#xff0c;学习电路设计需要掌握一定的基础知识和技能&#xff0c;同时需要有耐心和实践经验。本文将从七个方面总结如何学习电路设计&…

Vue (9)

Vue (9) 文章目录 1. 消息订阅与发布1.1 总结1.2 修改 TodoList 案例 2. 为 TodoList 添加编辑功能3. $nextTick4. 过度与动画4.1 动画效果4.2 过度效果4.3 集成第三方动画4.4 总结4.5 修改 TodoList 案例 1. 消息订阅与发布 上文我们已经将全局事件总线学完了知道了全局事件总…

day6 -- 数据的分组和描述性统计

学习内容 描述性统计函数&#xff0c;包括平均值&#xff0c;最大/小值&#xff0c;行数&#xff0c;总和使用 GROUP BY子句和HAVING子句 对数据进行分组操作 描述性统计数函数 除了上面提到的聚合函数外&#xff0c;MySQL还提供了以下其他一些常用的聚合函数&#xff1a; – …

Python学习40:维吉尼亚密码——解密

凯撒密码的加密强度是很低的&#xff0c;只需简单地统计字频就可以破译。人们在单一凯撒密码的基础上扩展出多表密码&#xff0c;称为“维吉尼亚”密码。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪…

【环境搭建】一些奇奇怪怪的环境问题

【设备信息】我的设备是4070ti&#xff0c;支持cuda12.0,但是目前用的还是11.7 1&#xff09;fatal error: cusparse.h: No such file or directory 因为cuda版本和改名的原因&#xff0c;这个在cuda版本中比较有效的解决办法是&#xff1a; sudo apt search libcusparse得到…