Vue3.0(三):Vue组件化深入理解

news2024/12/23 20:59:56

Vue组件化深入理解

生命周期

  • 每个组件都可能经历 创建、挂载、更新、卸载等一系列过程

  • 在每个阶段,我们可能会添加一些属于自己的逻辑代码

  • 在Vue中,生命周期通过生命周期函数实现

    • 生命周期函数实际上就是回调函数,在某个时间会被Vue源码调用
    • 通过 生命周期函数的回调,我们可以知道目前组件正在经历什么阶段

生命周期的流程

image.png
  • 初始化事件 生命周期
  • beforeCreate
  • 创建组件实例:初始化 注入和响应式
  • created:发送网络请求,事件监听,以及调用 this.$warch方法,data以及methods中的变量以及方法已经准备好
  • template模板编译
  • beforeMount
  • 挂载到虚拟DOM 虚拟DOM–>真实DOM–>界面看到元素的显示
  • **mounted:**元素已经被挂载,获取DOM,使用DOM
  • 数据更新:比如message改变
  • beforeUpdate
  • 根据最新数据生成VNode 生成虚拟DOM–>真实DOM
  • updated
  • 组件准备销毁的时候,会先调用beforeUnmount
  • 将之前挂载在虚拟DOM中的VNode从虚拟DOM移除
  • unmounted(回收操作,取消事件监听)

$refs的使用

在某些情况下,我们需要获取元素对象或者子组件的实例,通常使用 $refs来获取

  • $refs可以获取元素也可以获取组件的实例对象

image.png

动态组件

在Vue中有一个 <component is="组件名称"></component>用于显示不同的组件

  • 若要实现以下案例:有三个按钮,点击第一个按钮显示第一个组件,点击第二个按钮显示第二个组件,点击第三个按钮显示第三个组件
  • 实现思路:
    • 我们可以通过 v-if进行判断,显示哪个组件
    • 同时,可以通过 <component is="组件名称"></component>进行操作
<template>
  <div>
    <template v-for="item in tabList" :key="item.id">
      <button @click="clickItem(item)">{{ item.label }}</button>
    </template>
    <component :is="currentItem"></component>
  </div>
</template>

<script>
//引入组件
import Home from "./components/动态组件/Home.vue";
import Main from "./components/动态组件/Main.vue";
import Foot from "./components/动态组件/Foot.vue";
export default {
  //注册组件
  components: {
    Home,
    Main,
    Foot,
  },
  data() {
    return {
      tabList: [
        {
          id: 0,
          label: "首页",
          value: "Home",
        },
        {
          id: 1,
          label: "主要内容",
          value: "Main",
        },
        {
          id: 2,
          label: "页脚",
          value: "Foot",
        },
      ],
      currentItem: "",
    };
  },
  methods: {
    clickItem(value) {
      this.currentItem = value.value;
    },
  },
};
</script>
  • is属性对应的值,应当是全局注册的组件或者局部注册的组件
  • 同时,传递值的方法和正常的组件传递方法是一样的

Keep-alive让组件保持存活

当一个组件,我们需要缓存其组件中的状态,不希望在切换组件的时候,被销毁,就可以使用 <keep-alive></keep-alive>进行包裹

  • 可以单独包裹一个组件
 <keep-alive>
     <home v-if="flag"></home>
</keep-alive>
  • 可以包裹多个组件
    • 默认是全部都是保持存活的状态
<keep-alive>
    <component :is="currentItem"></component>
</keep-alive>
  • 可以设置部分存活
    • 通过在 keep-alive中设置属性控制
    • include:接受的参数:字符串/正则表达式/数组,代表那几个组件需要保持存活
    • exclude:接受的参数:字符串/正则表达式/数组,代表除去设置的组件外,其余的组件保持存活
    • 而二者匹配的是组件中,name选项,因此在创建组件的时候,要对组件设置name选项

image.png

  • 对于保持存活的组件 就没有销毁一说了,因此需要使用特殊的生命周期进行监听
    • 当切换到保持活跃的组件:使用 activated监听
    • 当隐藏保持活跃的组件:使用 deactivated监听

image.png

异步组件

在webpack打包的时候,默认会把所有的组件都打包到app.js的文件中,导致打包的体积很大,有可能会造成首屏加载速度过慢

因此我们可以将一部分组件设置成异步组件,异步组件在webpack打包的时候,就会单独打包称一个文件

  • webpcak的学习中,JS文件有两种导入方式
    • import直接导入:会被打包称一个文件
    • import函数导入:会单独打包成一个文件import("./utils").then((res)=>console.log(res)),返回的是一个Promise
  • 而在局部注册的时候,应该如何操作
    • 首先引入 defineAsyncComponent函数
    • 在函数中传入一个箭头函数 ()=>import(‘组件路径’)
    • 赋值即可
<template>
  <div>
    <home></home>
    <MainVue></MainVue>
    <!-- 异步组件 -->
    <foot></foot>
  </div>
</template>

<script>
//引入Vue中的defineAsyncComponent函数
import { defineAsyncComponent } from "vue";
//引入正常组件
import Home from "./components/动态组件/Home.vue";
import MainVue from "./components/动态组件/Main.vue";
//引入异步组件
const AsyncFoot = defineAsyncComponent(() =>
  import("./components/动态组件/Foot.vue")
);
export default {
  //注册组件
  components: {
    Home,
    MainVue,
    //将异步组件赋值给Foot
    //Foot按照正常组件使用即可
    Foot: AsyncFoot,
  },
};
</script>

组件的v-model

在普通元素中使用v-model可以实现数据的双向绑定,那么在组件中使用v-model是怎么样的

v-model默认绑定的是 modelValue,执行的事件是 @update:modelValue

  • 在普通元素中使用 v-model,实际上是做了两个步骤
    • 使用 v-bind将value关联到message
    • 之后通过事件,修改message
 <input :value="message" @change="message = $event.target.value" />
  • 而在组件中使用,依旧如此
    • 通过 v-bind绑定到一个固定名称的变量:modelValue
    • 而后通过 @update:modelValue事件改变值
----父组件
<home v-model="count"></home>
上面的写法等价于下面的写法
<home :modelValue="count" @update:modelValue="count = $event"></home>

-----子组件
<script>
export default {
    //方便父组件有事件提示
  emits: ["update:modelValue"],
    //接收父组件传进来的参数
  props: {
    modelValue: {
      type: Number,
    },
  },
  methods: {
      //发射事件
    countChange() {
      this.$emit("update:modelValue", 1);
    },
  },
};
</script>

绑定多个属性

若我们在绑定属性的时候,不想默认绑定modelValue和 @update:modelValue,我们可以通过 v-model:自定义名称=“变量”来改变

------父组件
<home v-model:nameText="text"></home>
------子组件
<script>
export default {
  emits: ["update:text"],
  props: {
    text: {
      type: String,
    }
  },
  methods: {
    textChange() {
      this.$emit("update:text", "lisi");
    }
  },
};
</script>

image.png

Mixin混入

当多个组件中有共同的代码,可以抽离封装成一个文件,这时候就需要用到Mixin的混入了

  • 首先创建一个 mixinTest.js文件
    • 里面可以写任何options api以及生命生命周期函数
export default {
  data() {
    return {
      message: "我是mixin",
    };
  },
  created() {
    console.log("mixincreated");
  },
  mehtods: {
    hello() {
      console.log("hello");
    },
  },
};

  • 在组件中使用mixin
<template>
  <div>Home组件 {{ message }}{{ name }}</div>
</template>

<script>
//引入混入文件
import mixinJS from "../mixin/mixin";
export default {
  mixins: [mixinJS],
  data() {
    return {
      name: "zhangcheng",
    };
  },
};
</script>
  • mixin的混入规则
    • 对于相同的,就会进行合并
    • 对于不同的,以组件内部定义的为准

Vue3.0(二):Vue组件化基础 - 脚手架

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

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

相关文章

14.scala隐式转换

目录 概述实践代码执行结果 结束 概述 隐式转换&#xff1a;偷偷的(隐式)对现有功能进行增强(转换) 实践 代码 package com.fun.scalaimport java.io.File import scala.io.Sourceobject ImplicitApp {def main(args: Array[String]): Unit {// implicit 2 to 等价 &…

后台系统--搭建前端环境

这里写目录标题 1. 安装vscode1.1 安装1.2 安装插件 2. 安装node.js&#xff0c;推荐163. 创建工作区3.1 创建空文件夹&#xff0c;不能有中文3.2 vscode打开文件夹&#xff0c;保存为工作区3.3 安装依赖 1. 安装vscode 1.1 安装 1.2 安装插件 2. 安装node.js&#xff0c;推荐…

C语言之数据在内存中的存储

目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断什么是大小端&#xff1f;为什么有大小端&#xff1f;练习1练习2练习3练习4练习5练习6 3. 浮点数在内存中的存储浮点数存的过程浮点数取得过程练习题解析 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们已经…

Windows下Node.js下载安装及环境变量配置教程

Windows下Node.js下载安装及环境变量配置教程 安装版本&#xff1a;node-v18.19.0-x64.msi 文章目录 Windows下Node.js下载安装及环境变量配置教程一、Node.js和NPM简介二、下载地址三、安装步骤四、环境配置五、安装淘宝镜像总结 一、Node.js和NPM简介 1、Node.js &#xf…

嵌入式软件设计方式与方法

1、嵌入式软件与设计模式 思从深而行从简 软件开发&#xff0c;难的不是编写软件&#xff0c;而是编写功能正常的软件。软件工程化才能保证软件质量和项目进度&#xff0c;而设计模式使代码开发真正工程化&#xff0c;设计模式是软件工程的基石。 所谓设计模式就是对常见问题的…

[BUUCTF]-PWN:inndy_echo解析

查看保护 查看ida 有格式化字符串漏洞&#xff0c;可以修改printf的got表内地址为system&#xff0c;传参getshell 解法一&#xff1a; 在32位中可以使用fmtstr_payload直接修改&#xff0c;免去很多麻烦 完整exp&#xff1a; from pwn import* pprocess(./echo) premote(n…

《低功耗方法学》翻译——附录B:UPF命令语法

附录B&#xff1a;UPF命令语法 本章介绍了文本中引用的所选UPF命令的语法。 节选自“统一电源格式&#xff08;UPF&#xff09;标准&#xff0c;1.0版”&#xff0c;经该Accellera许可复制。版权所有&#xff1a;(c)2006-2007。Accellera不声明或代表摘录材料的准确性或内容&…

Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝,无法连接...问题解决方法之一

一、问题描述 将Redis压缩包解压后&#xff0c;安装Redis过程中出现问题Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝&#xff0c;无法连接... 官网windows下redis开机自启动的指令如下&#xff1a; 1、在redis目录下执行 redis-server --service-in…

深入理解Java中的二叉树

目录 一、什么是二叉树? 二、二叉树的主要类型 三、二叉树的实现 四、二叉树的应用 五、关于二叉树的题目 引言: 二叉树是计算机科学中常用的一种数据结构&#xff0c;它是由节点组成的层级结构&#xff0c;每个节点最多有两个子节点。在Java编程语言中&#xff0c;二…

论文阅读——MP-Former

MP-Former: Mask-Piloted Transformer for Image Segmentation https://arxiv.org/abs/2303.07336 mask2former问题是&#xff1a;相邻层得到的掩码不连续&#xff0c;差别很大 denoising training非常有效地稳定训练时期之间的二分匹配。去噪训练的关键思想是将带噪声的GT坐标…

Spring Boot整合MyBatis Plus实现基本CRUD与高级功能

文章目录 1. 引言2. 项目搭建与依赖配置2.1 添加MyBatis Plus依赖2.2 配置数据源与MyBatis Plus 3. 实现基本CRUD功能3.1 创建实体类3.2 创建Mapper接口3.3 实现Service层3.4 控制器实现 4. 高级功能实现4.1 自动填充功能4.2 乐观锁功能4.3 逻辑删除功能 5. 拓展&#xff1a;My…

手机市场竞争加剧,三星7天机以优质性价比与服务脱颖而出

在当今竞争激烈的手机市场中&#xff0c;三星旗舰手机凭借其卓越的外观设计、强大的硬件配置等显著优势&#xff0c;一直稳坐市场的高地&#xff0c;深受星粉们的热烈追捧。然而&#xff0c;旗舰手机的高昂价格也让许多潜在用户望而却步。为了打破这一壁垒&#xff0c;让更多消…

运维自动化bingo前端

项目目录结构介绍 项目创建完成之后&#xff0c;我们会看到bingo_web项目其实是一个文件夹&#xff0c;我们进入到文件夹内部就会发现一些目录和文件&#xff0c;我们简单回顾一下里面的部分核心目录与文件。 ├─node_modules/ # node的包目录&#xff0c;项目运行的依赖包…

消息队列实现进程之间通信

1.消息队列号100进程端 #include<myhead.h> //消息结构体 struct msgbuf {long int mtype;//消息类型char mtext[1024];//消息内容 }; 不需要消息类型的大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)int main(int argc, char const *argv[]) {//创建键值…

88 docker 环境下面 前端A连到后端B + 前端B连到后端A

前言 呵呵 最近出现了这样的一个问题, 我们有多个前端服务, 分别连接了对应的后端服务, 前端A -> 后端A, 前端B -> 后端B 但是 最近的时候 却会出现一种情况就是, 有些时候 前端A 连接到了 后端B, 前端B 连接到了 后端A 我们 前端服务使用 nginx 提供前端 html, js…

仪器接口设计

不是所有设备都是TCP连接模式&#xff0c;有读文件的、读数据库的设备&#xff0c;为此还需要一个客户端仪器接口程序&#xff0c;面向接口编程是一个良好的思想&#xff0c;他使得调用者和接口实现者不用绑定太死&#xff0c;只要双方按约定实现即可。 仪器有读文件的、写文件…

Unity_修改天空球

Unity_修改天空球 Unity循序渐进的深入会发现可以改变的其实很多&#xff0c;剖开代码逻辑&#xff0c;可视化的表现对于吸引客户的眼球是很重要的。尤其对于知之甚少的客户&#xff0c;代码一般很难说服客户&#xff0c;然表现确很容易。 非代码色彩通才&#xff0c;持续学习…

详解spring6.0新特性汇总

spring6新特性汇总 part1 spring6.0新特性 spring6.0 2022年11月。新一代框架带jdk17&jakarta ee9 https://www.graalvm.org/ part2 AOP&事务 1.AOP:面向切面编程 通过预编译方式和运行期动态 代理实现程序功能的统一维护的一种技术。 使用场景&#xff1a; 权…

【如何学习CAN总线测试】——Vector VH6501干扰仪测试BusOff

系列文章目录 【如何学习CAN总线测试】系列文章目录汇总 文章目录 系列文章目录前言一、环境搭建1.硬件环境2.软件环境3.原理 二、测试方法1.打开Disturbance(CAN)工程2.使能 VH65013.MainConfigPanel面板4.TriggerConfiguration配置5.Sequence Configuration配置6.干扰结果 前…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…