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

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组件化基础 - 脚手架

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零售的这个销售模式,太震撼了!

随着科技的飞速发展&#xff0c;新零售模式正逐渐改变着传统零售业的面貌。在这个数字化时代&#xff0c;自动售货机作为新零售的一部分&#xff0c;正以其便捷、智能的特性&#xff0c;为商家和消费者带来全新的购物体验。 客户案例 智能便利店 传统便利店运营面临高租金、人…

【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/qq_39344192/article/details/131470735 1. 什么是UART&#xff1f; UART是一种异步串行通信接口&#xff0c;常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输&#xff0c;使…

保护个人信息安全,避免成为“互联网中的裸泳者”

⚽️ 一、互联网中的裸泳者&#x1f3c0; 二、代理 IP 的应用 - 解锁无限可能⚾️ 三、代理 ip 的几种类型 3.1 动态住宅代理&#xff08;Rotating Residential Proxy&#xff09;3.2 静态住宅代理&#xff08;Static Residential Proxy&#xff09;3.3 动态长效ISP&#xff08…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher&#xff08;国内授权代理商欣博盛生物&#xff09;是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

Python实现排序算法

目录 一&#xff1a;快速排序 二&#xff1a;合并排序 三&#xff1a;冒泡排序 四&#xff1a;插入排序 五&#xff1a;选择排序 一&#xff1a;快速排序 def quicksort(arr): if len(arr) < 1: return arr pivot arr[len(arr) // 2] le…

【Docker】入门到精通(常用命令解读)

一、准备工作 1.配置Docker的yum库 首先要安装一个yum工具 yum install -y yum-utils安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo2.安装Docker 执…

python创建pdf文件

目录 一&#xff1a;使用reportlab库 二&#xff1a;使用使pdf库 在Python中生成PDF文件可以使用多种库&#xff0c;其中最常用的是reportlab和fpdf。以下是使用这两个库生成PDF文件的示例代码&#xff1a; 一&#xff1a;使用reportlab库 1&#xff1a;写入文字信息 from r…

keil边框的背景色更改

网上有很多keil换背景色的帖子&#xff0c;效果如图&#xff1a; 可以看到&#xff0c;虽然代码区背景色设置为了黑色&#xff0c;但是上方、左侧边、下方的颜色并没有改变&#xff0c;看起来还是很不舒服。 机缘巧合&#xff0c;我想把Windows系统颜色设置为护眼的颜色&#x…

[Python图像处理] 使用OpenCV创建色调图

使用OpenCV创建色调图 色调映射和高动态范围成像应用色调映射相关链接 色调映射和高动态范围成像 高动态范围 (High Dynamic Range, HDR) 技术用于摄影成像&#xff0c;以再现比标准数字成像或摄影技术更大的动态范围的亮度。标准成像技术仅允许在一定范围内区分亮度&#xff…

yolov8使用旋转框自己做数据集检测

主要在数据集制作&#xff0c;训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具&#xff0c;这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件&#xff0c;然后把dota的xml文件转换成dota的txt文件…

Java List的合并与切分

在Java开发中经常遇到list结构数据的处理&#xff0c;如List的合并或拆分&#xff0c;记录下来&#xff0c;方便备查。 一、List 合并 两个list数据的合并处理&#xff0c;可使用Java8 新特性的stream流&#xff0c;根据实际需要遍历取值。 1、定义 UserInfo 对象 订单bean…

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

基于SpringBoot+Vue的师生疫情健康信息管理登记平台,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Acwing---830. 单调栈

单调栈 1.题目2.基本思想3.代码实现 1.题目 给定一个长度为 N N N 的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出 − 1 −1 −1。 输入格式 第一行包含整数 N N N&#xff0c;表示数列长度。 第二行包含 N N N 个整数&#xff0c…

vue2+html2pdf下载PDF,PDF分页切割

问题&#xff1a; PDF下载下来后&#xff0c;文档内容被暴力分割。 解决方案&#xff1a; HTML <!-- 打印按钮 --> <el-button type"primary" size"small" class"el-icon-download right_btn" click"downloadPDF">PDF&…

最短编辑距离问题与动态规划----LeetCode 72.编辑距离

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决复杂问题的一个强大工具&#xff0c;它将问题分解成更小的子问题&#xff0c;并使用这些子问题的解决方案来构建整体问题的解决方案。在深入探讨最短编辑距离问题之前&#xff0c;让我们先理解什么是动态规划&am…

CGAL的二维分段的Delaunay图

本章描述了CGAL的二维分段Delaunay图。我们从定义一节中的一些定义开始。2D段Delaunay图形包的软件设计在“软件设计”一节中进行了描述。在“几何特征”一节中&#xff0c;我们讨论了2D段Delaunay图包的几何特征&#xff0c;在“段Delaunay图层次结构”一节&#xff0c;简要描…

【Shell的运行原理以及Linux当中的权限问题】

Shell的运行原理以及Linux当中的权限问题 Shell的运行原理Linux当中的权限问题Linux权限的概念如何实现用户账号之间的切换如何仅提升当前指令的权限如何将普通用户添加到信任列表 Linux权限管理文件访问者的分类 (人)文件类型和访问权限 (事物属性)文件权限值的表示方法文件访…

MacOS系统电脑远程桌面控制windows系统电脑【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1…

自动化测试的ROI

ROI模型树 提升ROI的基础出发点&#xff1a;增加运行次数 手段&#xff1a;测试左移、测试右移 测试左移&#xff08;测试阶段&#xff09; 原始测试流程&#xff1a; 软件生命周期&#xff1a;软件需求分析、软件设计、软件开发、单元测试、集成测试、系统测试开发阶段&…