Vue(三):Vue 生命周期与工程化开发

news2025/1/20 18:31:45

2023 的最后一篇博客,祝大家元旦快乐,新的一年一起共勉!

06. Vue 生命周期

6.1 基本介绍

生命周期就是一个 Vue 示例从 创建销毁 的整个过程,创建、挂载、更新、销毁

有一些请求是必须在某个阶段完成之后或者某个阶段之前执行的

所以在 Vue 生命周期过程中,会 自动 运行一些函数,被成为 生命周期钩子,可以让开发者在特定的阶段运行自己的代码。

每个阶段对应两个钩子函数,共八个

这里面比较重要的是 createdmounted ,分别用于发送初始化渲染请求和操作 DOM

6.2 各个阶段及对应的钩子函数

创建阶段(Initialization)
  1. beforeCreate:在实例初始化之后,数据观测 (datamethods 初始化之前)。
  2. created:在实例创建完成后立即调用。可以在这个阶段进行数据操作,但是模板和虚拟DOM尚未生成。
挂载阶段(Mounting)
  1. beforeMount:在挂载开始之前调用,相关的 render 函数首次被调用。
  2. mounted:在挂载完成后调用,此时组件已经被挂载到 DOM 中。在这个阶段可以访问到模板中的元素,并可以对其进行操作。
更新阶段(Updating)
  1. beforeUpdate:在数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
  2. updated:在数据更新完成时调用,组件 DOM 已经更新。
销毁阶段(Unmounting)
  1. beforeDestroy:在实例销毁之前调用。此时实例仍然完全可用。
  2. destroyed:在实例销毁之后调用。该阶段组件完全被销毁,清理工作应该在这里完成。
<script src="./vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        count: 100,
        title: '计数器'
      },
      beforeCreate () {
        console.log('响应式数据准备好前');
      },
      created () {
        console.log('响应式数据准备好后');
      },
      beforeMount () {
        console.log('模板渲染前');
      },
      mounted () {
        console.log('模板渲染后');
      },
      beforeUpdate () {
        console.log('数据修改了,视图还没更新');
      },
      updated () {
        console.log('数据修改了,视图已经更新');
      },
      beforeDestroy () {
        console.log('销毁前');
      },
      destroyed () {
        console.log('销毁后');
      }
    })
  </script>

比如上面的测试代码,当我们可以看到视图的时候,创建阶段挂载阶段 已经执行完了,需要注意的是更新阶段更新的是视图,这两个阶段对应的都是视图更新前和更新后,不是数据。

6.3 created 应用

下面我们来实现一个加载新闻信息的实例,当用户打开网页渲染之前,我们需要发送请求将数据替换

<li class="news">
        <div class="left">
          <div class="title">模拟数据</div>
          <div class="info">
            <span>模拟数据</span>
            <span>模拟数据</span>
          </div>
        </div>
        <div class="right">
          <img :src="item.img" alt="">
        </div>
      </li>

比如将下面的模拟数据改为发送请求获取到的数据,这个操作需要在渲染之前,响应式数据准备完成之后再进行操作,这时候就用到了我们的 created 钩子函数,我们写如下的操作:

  1. 使用 v-for 渲染 li 标签
<li class="news" v-for="item in list" :key="item.id">
        <div class="left">
          <div class="title">{{item.title}}</div>
          <div class="info">
            <span>{{item.source}}</span>
            <span>{{item.time}}</span>
          </div>
        </div>
        <div class="right">
          <img :src="item.img" alt="">
        </div>
      </li>
  1. 通过 axios 发送请求并存储
<script src="./vue.js"></script>
  <script src="./axios.js"></script>
  <script>
    // 接口地址:http://hmajax.itheima.net/api/news
    // 请求方式:get
    const app = new Vue({
      el: '#app',
      data: {
        list: []
      },
      async created () {
        // 发送请求获取数据
        const res = await axios.get('http://hmajax.itheima.net/api/news');
        console.log(res);
        this.list = res.data.data;
      }
    })
  </script>

这样就完成了操作

07. 工程化开发

7.1 工程化开发基本介绍

Vue 的开发方式分为两种,一种是我们前面使用的导入核心包的传统开发模式,即基于 html、css、js 文件,直接引入 vue 核心包的开发方式。

还有一种是基于构建工具(例如 webpack)的环境总开发 Vue 的方式,自动化构建工具是用来 简化和优化 软件开发过程中的一系列重复性任务和复杂性操作的工具。它们可以帮助开发人员自动化地执行诸如编译、打包、优化、压缩、转译、部署 等多种任务,以提高开发效率并确保项目的质量和稳定性。

以下是自动化构建工具的主要功能和作用:

  1. 代码打包和压缩
    • 自动化构建工具能够将项目中的多个文件或模块打包成一个或多个最终可执行的文件,以减少网络传输时间和提高页面加载速度。
    • 它们还可以对代码进行压缩和优化,去除不必要的空格、注释和未使用的代码,从而减小文件大小,提高页面加载性能。
  2. 资源转换和处理
    • 自动化构建工具可以处理项目中的各种资源文件,例如将 SCSS 或 LESS 文件转换为 CSS,将 ES6+ 语法转译为兼容性更好的 ES5 代码,处理图片压缩等。
    • 通过这些转换和处理,开发者可以使用更加便捷的开发方式,而无需手动进行繁琐的转换工作。
  3. 模块化管理
    • 当项目中使用了模块化的开发方式时(如使用 CommonJS、ES6 模块等),自动化构建工具可以帮助将模块化的代码打包成浏览器可识别的代码。
    • 它们可以管理模块之间的依赖关系,将多个模块合并为一个文件,以提高页面的加载速度和性能。
  4. 代码检查和测试
    • 自动化构建工具可以集成代码检查工具,如 ESLint、JSHint、TSLint 等,帮助开发者发现并修复代码中的潜在问题和错误。
    • 它们还可以集成单元测试和端到端测试工具,自动运行和监控测试用例,以确保代码质量和功能的稳定性。
  5. 部署和发布
    • 自动化构建工具可以帮助开发者简化项目的部署和发布流程,自动将构建后的代码部署到服务器或云端,以便最终的产品发布和线上运行。

但是 webpack 的配置并不简单,而且由于很多雷同的配置需要重复进行,且没有统一的配置标准,使得开发研究成本比较高,这就需要用到一个工具来进行 标准化 的配置。

这就要提到 Vue CLI。

7.2 Vue CLI 基本介绍

​ Vue CLI 是一个由 Vue.js 官方提供的命令行工具,用于快速搭建 Vue.js 项目管理项目依赖开发和构建 Vue.js 应用程序。它是 Vue.js 生态系统中的一个重要工具,能够帮助开发者快速初始化 Vue.js 项目,并提供了一套现代化的开发环境和工作流程

使用步骤:

  1. 全局安装

    通过 yarn 安装
    yarn global add @vue/cli
    通过 npm 安装
    npm i @vue/cli -g
    
  2. 检查安装是否成功(查看版本)

    vue -- version
    
  3. 创建项目架子(初始化项目),project-name 是你的项目名,不要使用中文名

    vue create project-name
    
  4. 启动项目(通过 package.json 查看)

    通过 yarn 启动
    yarn serve
    通过 npm 启动
    npm run serve
    

完成了上述的步骤,我们就拥有了一个 vue 开发的初始模板,且安装是一次安装,我们后续可以任意使用 vue create 全局命令拉取模板,开机不需要再次安装。

通过在 vs 中打开项目我们可以见到如下的目录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来让我们来认识这些文件。

7.3 目录介绍

基于 vue2 构建的和基于 vue3 构建的在一些语法方面可能有部分不同,这里先看基于 vue2 构建的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里面最核心的是 index.html App.vuemain.js 三个文件,main.js 可以看作是程序的入口,首先会执行这里面的代码:

Vue 2main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

Vue 3main.js

import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')

这两个版本起到的作用是相同的,首先是引入了 App 组件和 createApp 函数,再利用下面的 createApp 将这个组件(后面详细的讲组件是什么)渲染到 index.html 中 id 名为 app 的容器中。

index.html

<!DOCTYPE html>
<html lang="">
  <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">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <!-- 对不支持 JavaScript 的浏览器的适配,显示下面语句 -->
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

  • index.htmlindex.html 是整个应用的入口 HTML 文件。它是一个静态文件,通常位于项目的 public 文件夹中。这个文件是最初由 Vue CLI 自动生成的,其中可能包含一些标记,比如 <div id="app"></div>,这个 div 标签就是 Vue 应用所挂载的根 DOM 元素。
  • main.jsmain.js 是 Vue 应用的主要 JavaScript 文件。它是应用的入口文件,在这里创建了 Vue 实例,并将其挂载到 index.html 中的根 DOM 元素上。main.js 中通常包含了创建 Vue 实例、引入所需的组件、配置路由(如果有的话)、设置全局配置等逻辑。

main.js 文件通过 Vue 实例化,并在指定的 DOM 元素中(通常是 index.html 中的 <div id="app"></div>)挂载 Vue 应用。这种挂载过程将 Vue 应用程序和 HTML 文件联系在一起,实现了 Vue 应用的渲染和展示。

虽然 index.htmlmain.js 之间没有直接的物理绑定,但通过 Vue 的挂载机制,main.js 中创建的 Vue 实例会将应用程序动态地渲染到 index.html 中指定的位置,因此二者是应用程序的入口文件和主逻辑文件。

下面我们来启动一个项目看看效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行 yarn serve ,我们打开浏览器输入地址,默认在(8080 端口打开),看到下面的界面就表示成功了:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面我们来试试上面讲的机制

import Vue from 'vue'
Vue.config.productionTip = false
new Vue({ 
}).$mount('#app')

我们将 App 组件移除,这时候界面是完全空白的了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说明确实是影响到了 index.html 界面

7.4 组件化

上面一直提到组件化,接下来让我们来具体的看看组件化是什么。

组件化就是将页面拆分成一个个小的组件,这样做的意义是什么呢?

之前我们开发的网页都比较简单,修改和维护都很容易,但是如果开发的是一整个项目的话,那么寻找是哪个部分出了问题或者修改某个部分都有很大的工作量,而且如果多个界面出现重复的内容,只能通过复制粘贴的方式解决。

所以为什么不把网页拆分成一个个小组件,比如说一个大的页面有头部组件、主题组件、尾部组件,这些组件里面 又有一个个小的组件,这样维护起来就十分容易,只需要去修复对应的组件即可,而且也解决了复用性的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
html 中的 body 一样,组件也有包含所有小组件的大组件,作为整个应用的最上层,我们称之为 根组件

7.5 组件的组成

当我们打开 App.vue 的时候,会发现和我们平时写的 vue 代码有很大的差别,其实一个组件可以分为三部分,分别控制这个组件的行为、结构和样式,对应着 javascript htmlcss

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果代码不是和我一样高亮的需要安装 Vetur 插件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.4 组件的注册和使用

组件可以看成一个个的积木,我们通过将这些组件组合在一起就搭建起了整个网页,那积木也有搭建某一部分使用的和搭建全局都需要使用到的积木(不知道这个例子恰不恰当,主要是看使用的范围)。

对于这些经常需要用到的的就可以注册为 全局组件,而那些部分地方需要的就可以注册为 局部组件 来局部的注册和使用。

先来看局部注册的方式,局部注册只能在注册的组件内使用,分为两步:

  1. 创建 .vue 文件
  2. 在使用的组件内 导入注册

比如我们来看 Vue 架子准备好的 App.vue

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们引入这个对象后,需要在该组件的配置对象的 components 中注册组件,原本的写法应该是 组件名: 组件对象 作为 components 对象的属性,但是变量名和变量值相同可以简写成为上述的写法。

使用就可以当作正常的 html 标签使用,还可以传递属性。

再来看看我们引入的内容:

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  }
}
</script>

上面的是 HellowWorld 组件中的导出部分,我们通过
import HelloWorld from './components/HelloWorld.vue' 语句可以拿取到默认导出的部分并且将它赋值给 HelloWorld 变量。

很明显这个默认导出的部分就是 HellowWorld 组件的 配置对象,在上面的例子中我们传递了 Welcome to Your Vue.js App 的字符串变量(关于这部分后面详细解释)。

再来看全局注册的方式,全局注册于局部注册唯一的不同就是在 main.js 中进行注册

import Vue from 'vue'
// 引入组件
import HelloWorld from './components/HelloWorld'
import App from './App.vue'
// 全局注册
Vue.component(HelloWorld)

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

这样注册的组件在全局都可以使用。

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

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

相关文章

C++ 递归函数 详细解析——C++日常学习随笔

1. 递归函数 1.1 递归函数的定义 递归函数&#xff1a;即在函数体中出现调用自身的函数&#xff0c;即函数Func(Type a,……)直接或间接调用函数本身&#xff1b; 递归函数&#xff1a;在数学上&#xff0c;关于递归函数的定义如下&#xff1a;对于某一函数f(x)&#xff0c;其…

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测预测效…

计算机网络:知识回顾

0 本节主要内容 问题描述 解决思路 1 问题描述 通过一个应用场景来回顾计算机网络涉及到的协议&#xff08;所有层&#xff09;。如下图所示场景&#xff1a; 学生Bob将笔记本电脑用一根以太网电缆连接到学校的以太网交换机&#xff1b;交换机又与学校的路由器相连&#xf…

Windows10系统的音频不可用,使用疑难解答后提示【 一个或多个音频服务未运行】

一、问题描述 打开电脑&#xff0c;发现电脑右下角的音频图标显示为X&#xff08;即不可用&#xff0c;无法播放声音&#xff09;&#xff0c;使用音频自带的【声音问题疑难解答】&#xff08;选中音频图标&#xff0c;点击鼠标右键&#xff0c;然后选择“声音问题疑难解答(T)”…

【Java进阶篇】 ClassNotFoundException和NoClassDefFoundError的区别是什么?

ClassNotFoundException和NoClassDefFoundError的区别 ✔️典型解析✔️扩展知识仓✔️NoSuchMethodError ✔️典型解析 ClassNotFoundException是一个受检异常 (checked exception) 。他通常在运行时&#xff0c;在类加载段尝试加载类的过程中&#xff0c;找不到类的定义时触发…

每个AI/ML工程师必须了解的人工智能框架和工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)三

第二部分、线性表详解&#xff1a;数据结构线性表10分钟入门 线性表&#xff0c;数据结构中最简单的一种存储结构&#xff0c;专门用于存储逻辑关系为"一对一"的数据。 线性表&#xff0c;基于数据在实际物理空间中的存储状态&#xff0c;又可细分为顺序表&#xff…

PyTorch的Tensor(张量)

一、Tensor概念 什么是张量&#xff1f; 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展 Tensor与Variable Variable是torch.autograd中的数据类型&#xff0c;主要用于封装Tensor&#xff0c;进行自动求导。 data: 被包装的Tensorgrad: data的梯度&…

windows进行udp端口转发,解决项目中服务器收不到组播数据的问题

说明 windows7的netsh interface portproxy命令只支持tcp端口转发 如果要进行udp端口转发可以使用sokit 运行sokit 端口转发&#xff08;以为tcp作为讲解&#xff0c;udp类似&#xff09; 选择转发器 输入监听地址&#xff08;SRC地址&#xff09;和端口 输入转发地址&am…

【Linux】Linux 下基本指令 -- 详解

无论是什么命令&#xff0c;用于什么用途&#xff0c;在 Linux 中&#xff0c;命令有其通用的格式&#xff1a; command [-options] [parameter] command&#xff1a;命令本身。-options&#xff1a;[可选&#xff0c;非必填]命令的一些选项&#xff0c;可以通过选项控制命令的…

MySQL存储过程、创建、调用、查看、删除、存储过程与函数的额区别、缺陷等、存储过程写分页等

MySQL存储过程 1、存储过程的定义2、存储过程使用的意义3、存储过程的创建4、存储过程的调用5、存储过程的查看6、存储过程的删除7、存储及过程与函数的区别8、存储过程的缺陷9、存储过程写分页 1、存储过程的定义 存储过程&#xff1a;存储过程&#xff08;Stored Procedure&…

【Java EE初阶三 】线程的状态与安全(下)

3. 线程安全 线程安全&#xff1a;某个代码&#xff0c;不管它是单个线程执行&#xff0c;还是多个线程执行&#xff0c;都不会产生bug&#xff0c;这个情况就成为“线程安全”。 线程不安全&#xff1a;某个代码&#xff0c;它单个线程执行&#xff0c;不会产生bug&#xff0c…

【第5期】前端Vue使用Proxy+Vuex(store、mutations、actions)跨域调通本地后端接口

本期简介 本期要点 本地开发前后端如何跨域调用全局请求、响应处理拦截器处理封装HTTP请求模块编写API请求映射到后端API数据的状态管理 一、 本地开发前后端如何跨域调用 众所周知&#xff0c;只要前端和后端的域名或端口不一样&#xff0c;就存在跨域访问&#xff0c;例如&…

QString设置小数点精度位数

QString设置小数点精度位数 Chapter1 QString设置小数点精度位数Chapter2 Qt中QString.toDouble有效位数6位问题以及数据小数点有效位数的处理问题一&#xff1a;QString.toDouble有效位只有6位问题二:小数点有效位数的问题 Chapter3 qt QString转Double只显示6位数字的问题(精…

FTP的基本介绍

FTP ftp的介绍&#xff1a; ftp是一个可以提供共享文件的服务器&#xff0c;他可以通过iis.msc也就是windows 的服务器管理器来打开&#xff0c;或者通过cmd命令行打开 如何使用iis.msc打开ftp&#xff0c;如何使用cmd打开ftp &#xff0c;如何匿名登录ftp&#xff0c;ftp和…

设计模式-调停者模式

设计模式专栏 模式介绍模式特点应用场景调停者模式与命令模式的比较代码示例Java实现调停者模式Python实现调停者模式 调停者模式在spring中的应用 模式介绍 调停者模式是一种软件设计模式&#xff0c;主要用于模块间的解耦&#xff0c;通过避免对象之间显式的互相指向&#x…

YOLOv8改进 | 2023注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制)

一、本文介绍 本文给家大家带来的改进机制是iRMB&#xff0c;其是在论文Rethinking Mobile Block for Efficient Attention-based Models种提出&#xff0c;论文提出了一个新的主干网络EMO(后面我也会教大家如何使用该主干&#xff0c;本文先教大家使用该文中提出的注意力机制…

Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码

UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。 UWB&#xff08;超宽带&#xff09;高精度定位系统是一…

08.哲说建造者模式(Builder Pattern)

“The odds that we’re in ‘base reality’ is one in billions.” —— Elon Musk 这段话出自马斯克在2016年的一次演讲&#xff0c;“人类活在真实世界的几率&#xff0c;可能不到十亿分之一”。此言一出&#xff0c;可谓一石激起千层浪。有人嘲讽马斯克是“语不惊人死不休…

论文阅读——SG-Former

SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图&#xff0c;根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的&#xff0c;并在训练过程中自我进化。直观地说&#xff0c;我们…