【前端学习笔记】Vue2基础

1.介绍

Vue 是一套用来动态构建用户界面的渐进式JavaScript框架

  • 构建用户界面:把数据通过某种办法变成用户界面
  • 渐进式:Vue可以自底向上逐层的应用,简单应用只需要一个轻量小巧的核心库,复杂应用可以引入各式各样的Vue插件
  • 遵循MVVM模式
  • 编码简洁,体积小,运行效率高,适合移动/PC端开发
  • 它本身只关注 UI,可以引入其它第三方库开发项目
  • 采用组件化模式,提高代码复用率、且让代码更好维护
  • 声明式编码,让编码人员无需直接操作DOM,提高开发效率
  • 使用虚拟DOMDiff算法,尽量复用DOM节点

MVVM:Model(模型)、View(视图)和ViewModel(视图模型)。MVVM的主要目标是将应用程序的UI与其底层数据模型分离,通过数据绑定实现数据和UI的自动同步,从而降低代码的耦合度,提高应用程序的可维护性和可测试性。
Model:Model表示应用程序的数据模型或业务逻辑,负责处理数据的存取、处理和操作。它通常包含数据结构、数据库操作、网络请求等。Model并不直接与UI层交互,它只暴露一些接口供ViewModel层调用,使得ViewModel可以获取所需的数据。
View:View是用户界面的可视化部分,负责展示数据并与用户进行交互。View通常由XML、HTML、XAML等描述,这取决于具体的开发平台。
ViewModel:ViewModel是Model和View之间的桥梁,负责将数据从Model中取出并转换成View可用的形式。ViewModel不直接操作View,而是通过数据绑定机制将数据与View进行绑定,使得数据的变化可以自动反映在View上,实现了数据的双向绑定。ViewModel通常也包含用户交互的逻辑,例如处理用户输入、按钮点击等。

1.如何理解Vue的MVVM?

MVVM模型

  • M:模型 Model,data中的数据
  • V:视图 View,模板代码
  • VM:视图模型 ViewModel,Vue实例
    在这里插入图片描述

2.虚拟DOM

虚拟DOM(Virtual DOM)是现代前端框架(如 React、Vue 等)中用于优化页面渲染性能的技术。它是一种通过 JavaScript 对象描述页面结构的方式,而不是直接操作浏览器的 DOM。通过这种方式,可以在内存中进行更高效的 DOM 操作,减少不必要的页面重新渲染,从而提高应用的性能和响应速度。

虚拟 DOM 是一个 JavaScript 对象,它模拟了真实 DOM 结构。真实 DOM 是浏览器中直接操作的文档对象模型,而虚拟 DOM 则是存在于内存中的一个轻量级对象。虚拟 DOM 的设计理念是:

  • 描述而非直接操作:虚拟 DOM 描述了页面的 UI 结构,它与实际的浏览器 DOM 对应,但是它并不直接操作页面。它只是用来优化 UI 更新。
  • 效率提升:当组件状态发生变化时,Vue 并不会直接对浏览器的 DOM 进行修改,而是先在虚拟 DOM 中进行更新,然后通过一种高效的算法(Diff 算法)来计算虚拟 DOM 与旧虚拟 DOM 的差异,并将需要更新的部分批量应用到真实 DOM 上。

虚拟 DOM 本质上是一个 JavaScript 对象,通常每个 Vue 组件的渲染结果都会生成一个虚拟 DOM 树。这个树的每个节点都是一个虚拟 DOM 节点,它包含了组件的结构和它的所有属性。Vue 的虚拟 DOM 节点通常由 VNode(虚拟节点)表示。一个 VNode 对象包含的信息通常包括:

  • 类型:节点的类型,例如元素类型(div、span、h1等)或组件类型。
  • 数据:该节点的属性、事件、样式等。
  • 子节点:节点的子节点,通常是嵌套的虚拟 DOM 节点或文本节点。
  • 文本内容:如果是文本节点,它会包含文本内容。
  • 标识:虚拟节点的唯一标识

在这里插入图片描述
好处:

  1. 减少不必要的重绘和回流:
    传统的 DOM 操作可能会导致浏览器多次重新绘制和回流,尤其是对于频繁更新的组件,性能开销非常大。而 Vue 的虚拟 DOM 会尽量减少这些操作,仅更新发生变化的部分。
  2. 批量 DOM 更新:
    Vue 在进行渲染更新时,不会每次变化都去直接修改 DOM,而是等到需要的更新都准备好之后再一起应用,从而减少了 DOM 操作的次数。
  3. 高效的 Diff 算法:
    Vue 使用高效的算法来比较新旧虚拟 DOM 的差异,并且采用了深度比较、节点类型比较等优化措施,使得 Diff 的性能足够优秀

3.Diff算法

Diff 算法是虚拟 DOM 渲染过程中比较新旧树差异的算法,它的基本思路是通过对比旧的虚拟 DOM 树和新的虚拟 DOM 树,找到两者之间的差异,然后只更新发生变化的部分。这种方法能够避免不必要的重新渲染和性能开销。 O(n) 的时间复杂度。

它是通过同层的树节点进行比较的高效算法。比较只会在同层级进行, 不会跨层级比较;在diff比较的过程中,循环从两边向中间比较。也就是对于同一层,对于新旧层,每次都从两边往中间去,一次比对好最旁边的一个节点,然后把开始的指针往里去一个,再遍历比较。

在这里插入图片描述
Vue2需要下载Node.js和npm,还要vue-cli脚手架。

新建自己的项目:

vue init webpack yourProject

运行:

npm run dev

4.数据代理

2.基础

突然不知道该怎么下手学Vue了,我想先从特性来吧。
在这里插入图片描述

0.项目解析

别人解析的:
在这里插入图片描述

my-vue-project/
├── node_modules/               # 项目依赖
├── public/                     # 静态资源文件夹
│   └── index.html              # 项目的入口 HTML 文件
├── src/                        # 源代码文件夹
│   ├── assets/                 # 存放静态资源(如图片、样式等)
│   ├── components/             # 存放 Vue 组件
│   ├── views/                  # 页面视图组件(如 Home.vue, About.vue)
│   ├── store/                  # Vuex 状态管理
│   ├── router/                 # Vue Router 路由配置
│   ├── App.vue                 # 根组件
│   ├── main.js                 # 项目入口文件
├── .gitignore                  # Git 忽略文件
├── babel.config.js             # Babel 配置
├── package.json                # 项目信息及依赖管理
└── vue.config.js               # Vue CLI 配置(可选)

1.学习路径

  1. Vue 入门

    • Vue 实例:理解 Vue 是如何通过实例化一个 Vue 对象来挂载和管理应用的。
    • 模板语法:学习 Vue 的模板语法,包括插值表达式({{}})、指令(如 v-if, v-for),事件处理(如 v-on),双向绑定(如 v-model)。
    • 计算属性与侦听器:掌握计算属性(computed)和侦听器(watch),它们在处理动态数据时非常有用。
    • 数据绑定与 DOM 更新机制:了解 Vue 如何响应式地更新 DOM,以及它背后的数据绑定原理。
  2. Vue 组件

    • 组件化开发:理解 Vue 中组件的概念,掌握如何定义和使用组件。学习如何将应用拆分为多个小的、独立的组件,以增强可维护性和可复用性。
    • Props 和 Events:学习如何通过 props 向子组件传递数据,并通过 $emit 触发事件向父组件发送消息。
    • 插槽(Slots):理解 Vue 插槽的概念,学习如何使用具名插槽、作用域插槽来实现更灵活的组件间传递和渲染内容。
  3. Vue Router

    • 路由基础:了解 Vue Router 如何帮助你在单页应用(SPA)中进行页面间的导航。学习如何配置路由,使用 router-linkrouter-view
    • 动态路由和嵌套路由:学习如何设置动态路由,嵌套路由的配置,以及如何通过路由传递参数。
    • 导航守卫:掌握如何使用路由的导航守卫(如 beforeEachbeforeResolve)进行权限控制、数据预加载等。
  4. Vuex(状态管理)

    • Vuex 概述:理解 Vuex 是什么,为什么它是必不可少的,尤其是当应用变得复杂时,它如何帮助管理全局状态。
    • Vuex 核心概念:学习 Vuex 的核心概念,如 statemutationsactionsgettersmodules。掌握如何通过 Vuex 在多个组件之间共享数据。
    • 调试工具:了解如何使用 Vue Devtools 来调试 Vuex 状态管理。
  5. Vue 的生命周期钩子

    • 学习 Vue 组件的生命周期钩子,如 createdmountedupdateddestroyed,并理解它们在组件不同生命周期阶段的作用。
  6. Vue 的响应式原理

    • 深入理解 Vue 的响应式系统,了解 Vue 如何使用 Object.definePropertyProxy 实现数据绑定和 DOM 更新机制。
  7. Vue 组件的高级特性

    • 异步组件:学习如何懒加载组件,优化大规模应用的性能。
    • 动态组件:掌握如何使用 v-bind:is 动态切换组件。
    • Mixins 和自定义指令:了解 Vue 中的 Mixins 机制以及如何创建和使用自定义指令。
  8. Vue 的性能优化

    • 虚拟 DOM:了解 Vue 的虚拟 DOM 渲染机制,如何减少不必要的 DOM 更新。
    • 异步更新队列:学习 Vue 如何批量更新 DOM,提高性能。
    • 组件懒加载:学习如何使用 Vue Router 的路由懒加载和异步组件来减少首次加载的时间。
    • 性能调优工具:掌握如何使用 Vue Devtools 进行性能分析,检测性能瓶颈。
  9. 测试

    • 学习如何为 Vue 组件编写单元测试。你可以使用工具如 JestMocha 来进行测试。
    • 了解如何使用 Vue Test Utils 进行组件测试,掌握模拟事件、测试组件的渲染和行为等。

2. Vue实例

每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的:

var vm = new Vue({// 选项
})
new Vue({el: '#app', // 指定挂载点data: {// 定义响应式数据message: 'Hello Vue!'},methods: {// 定义方法reverseMessage() {return this.message.split('').reverse().join('');}},// 其他选项...
});

上面的el属性指定了Vue实例应该挂载到的DOM元素,data属性定义了响应式数据,methods属性定义了组件的方法。

在Vue实例创建后,你可以通过this关键字在组件的方法、计算属性和生命周期钩子中访问该实例。
在这里插入图片描述
每个Vue实例在其创建过程中都会经历几个关键的生命周期阶段:

  • 创建(Creation):实例被创建,此时可以设置数据和方法。
  • 挂载(Mounting):实例被挂载到DOM上,此时可以访问DOM元素。
  • 更新(Updating):数据变化导致DOM更新。
  • 渲染(Rendering):Vue生成新虚拟DOM树并进行对比,然后进行实际的DOM更新。
  • 销毁(Destruction):实例被销毁,清理事件监听器和子组件。

el有2种写法

  • 创建Vue实例对象的时候配置el属性
  • 先创建Vue实例,随后再通过vm.$mount('#root')指定el的值

data有2种写法

  • 对象式:data: { }
  • 函数式:data() { return { } }

用到组件时,data必须使用函数形式,否则会报错。
由Vue管理的函数,一定不要写箭头函数,否则 this 就不再是Vue实例了。

3. 模板语法

Vue 的模板语法是 Vue 中非常核心的部分,它是 Vue 用来将数据绑定到 DOM 的方式。通过模板语法,Vue 使得开发者能够在 HTML 模板中直接操作数据和展示视图,极大地简化了前端开发。Vue 模板目前只允许一个根元素–一个元素需要包裹模板内的所有内容(Vue 3 发布后会改变这种情况)。模板语法分两类:文本插值语法与指令语法。

插值表达式:插值表达式是 Vue 模板中最常用的一种数据绑定方式,{{ x }} 是一个插值表达式,它会被 Vue 渲染成 x 数据属性的值。Vue 会自动跟踪 x 数据属性的变化,并更新 DOM 中的内容。

通过 {{}} 插入 JavaScript 表达式,表达式中的数据会实时反映在 DOM 中。
支持简单表达式:如字符串、数字、布尔值、数组等。不能包含语句。

<div>{{ x }}</div>
<!--x  js 表达式,可以直接读取到 data 中的所有区域 --!>

指令语法:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。Vue 的指令是带有前缀 v- 的特殊属性,指令提供了对 DOM 的动态控制,它们通常用于绑定数据、控制渲染、处理事件等。

  1. v-html:插入为html;<span v-html="xxx"></span>
  2. v-bind 用于将元素的属性绑定到 Vue 实例中的数据。单向数据绑定,数据只能从data流向页面。可以使用 v-bind:href/src/style/class,也可以使用 :href/src/style/class 简写。
<!-- 使用 v-bind 指令 -->
<img v-bind:src="imageUrl" alt="User avatar">
<!-- 使用 : 缩写 -->
<img :src="imageUrl" alt="User avatar">
  1. v-model 用于在表单控件(如 <input><textarea><select> 等)和 Vue 数据之间创建双向绑定。数据不仅能从data流向页面,也能从页面流向data;把v-model:value简写为v-model<input v-model="message">
  2. v-if / v-else / v-else-if:条件渲染,只有条件为 true 时才渲染该元素。如果条件为 false,Vue 会从 DOM 中移除该元素。
  3. v-show 用于根据条件显示或隐藏元素,但与 v-if 不同,v-show 仅仅是通过 display 样式来控制元素的显示和隐藏。性能:v-if会完全销毁和重建元素,而 v-show 只是简单地切换元素的显示状态。因此,如果切换频繁,v-show 性能更好。
  4. v-for 用于基于数组或对象渲染一个列表。可以通过 v-for 来循环渲染 DOM 元素。<li v-for="(item, index) of items" :key="index">,这里key可以是index,更好的是遍历对象的唯一标识
  5. v-on:监听DOM事件并在事件触发时执行方法,缩写为@ 字符。可以监听多种事件,如 click、input、keyup 等,可以绑定到方法、内联事件处理函数等。
<a v-on:click="doSomething"> ... </a>
<!-- 简写 -->
<a @click="doSomething"> ... </a>

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

v-text指令:向其所在的节点中渲染文本内容,v-text会替换掉节点中的内容;
v-html指令:向指定节点中渲染包含html结构的内容 ,v-html会替换掉节点中所有的内容,v-html可以识别html结构;
v-cloak指令(没有值):本质是一个特殊属性,配合css,暂时隐藏 Vue 模板中的未编译内容,直到 Vue 实例完成编译和渲染;
v-once 指令:v-once所在节点在初次动态渲染后,就视为静态内容了,以后数据的改变不会引起v-once所在结构的更新;
v-pre指令:跳过v-pre所在节点的编译过程,可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在Vue.js中,事件修饰符(Event Modifiers)是特殊的后缀,可以被添加到 v-on 指令的参数中,用来指定如何处理事件。

  1. .stop:阻止事件冒泡。

    <template><div @click="handle('parent')"> <!-- 点击父元素 --><button @click.stop="handle('child')"> <!-- 点击子元素,.stop 阻止事件冒泡到父元素 -->Click me</button></div>
    </template>
    
  2. .prevent:阻止默认事件(如表单提交)。

    <template><form @submit.prevent="onSubmit"><button type="submit">Submit</button></form>
    </template>
    
  3. .capture:使用事件捕获模式监听事件。通常事件会从父元素流向目标元素,捕获则是反过来。

    <template><div @click.capture="handle">Click me</div>
    </template>
    
  4. .self:只当事件是在该元素本身触发时才会触发回调。

    <template><div @click.self="handle"><button>Click me</button><button>Click me too</button></div>
    </template>
    
  5. .once:事件将只会被触发一次,之后监听器会被移除。

    <template><button @click.once="handle">Do this once</button>
    </template>
    
  6. .passive:告诉浏览器你不想阻止事件的默认行为,常用于提升滚动性能。

    <template><div @scroll.passive="handleScroll">Scroll me</div>
    </template>
    
  7. .native:监听组件根元素的原生事件。

    <template><my-component @click.native="handleClick" />
    </template>
    
  8. .sync(Vue 2.3.0+):用于 v-model,在自定义组件上实现双向数据绑定。

    <template><child-component :value.sync="parentValue" />
    </template>
    
  9. .exact(Vue 2.5.0+):当使用多个修饰符时,.exact 修饰符可以确保除了指定的事件外,其他事件监听器不会被触发。

    <template><div @click.exact="handle">Click me</div>
    </template>
    

这些修饰符可以组合使用,例如 @click.stop.prevent 可以同时阻止事件冒泡和默认行为。

Key的作用

  • 在v-for中需要key,因为如果不用key就采用就地更新原则(一个挨一个改),当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。
  • key是虚拟DOM的唯一标识。

4. 计算属性

属性是指data里的数据,前者为属性名,后者为属性值。如果需要的属性(数据)不存在,就需要计算得到。计算属性是基于它们的依赖进行缓存的,只有当依赖发生变化时,它们才会重新计算。

底层借助了Objcet.defineproperty()方法提供的getter和setter。getter在初次读值和依赖的数据改变时会调用。setter在该属性被修改时会调用。

与methods实现相比,内部有缓存机制(复用),效率更高,调试方便 。一个计算属性仅会在其响应式依赖更新时才重新计算。否则立即返回先前的计算结果,而不用重复执行 getter 函数。方法调用总是会在重渲染发生时再次执行函数。

计算属性最终会出现在vm上,直接读取使用即可;如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变;如果计算属性确定不考虑修改,可以使用计算属性的简写形式。

语法:

computed{计算属性名:{	get(){},set(){}}}
new Vue({el:'#root',data:{n:12},computed: {//完整写法fun: {get(){return n++;},set(value){this.n=value}// 简写fun2() {return this.n++}}
})

5. 监视属性(侦听器)

侦听器允许你“监听”一个数据属性(或计算属性)的变化。当这个数据属性发生变化时,Vue 会自动触发相应的回调函数。watch 选项 当需要在数据变化时执行异步或开销较大的操作时,用侦听器来响应数据变化。

watch: {message(newVal, oldVal) {console.log(`message changed: ${oldVal} -> ${newVal}`);}
}

watch监视属性

  • 当被监视的属性变化时,回调函数handler自动调用,进行相关操作
  • 监视的属性必须存在,才能进行监视,既可以监视data,也可以监视计算属性
  • 配置项属性默认为immediate:false,改为 true,则初始化时调用一次 handler(newValue,oldValue)

Vue侦听器可以接受更多的选项来控制其行为:

  • deep:如果需要侦听一个对象内部属性的变化,可以设置deep: true
  • immediate:如果需要在侦听器定义后立即以当前的值触发它,可以设置immediate: true
  • handler:一个函数或方法名,当被侦听的属性变化时调用。

在 Vue 中,当数据变动时,侦听器会在当前的同步代码执行完后立即执行。
侦听器会将回调放入 微任务队列,这意味着它们会在当前同步代码执行完成后,立刻执行,但在其他事件(如 setTimeout、UI 渲染等宏任务)之前执行。

会将数据变动队列推入一个 异步队列 中,并在下一个事件循环(微任务队列(microtask queue))中执行这些任务。

6.Vue生命周期

生命周期:又名生命周期回调函数、生命周期函数、生命周期钩子;Vue在关键时刻帮我们调用的一些特殊名称的函数;生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的;生命周期函数中的 this 指向是vm或组件实例对象。
。。。。

7.组件化编程

Vue 的 组件化编程 是 通过将应用程序分解成一个个独立的、可复用的组件来构建用户界面。每个组件代表应用的一个独立部分,拥有自己的数据、模板、样式和逻辑。这种方式不仅可以提高代码的可维护性和可重用性,还能帮助开发者更好地组织大型应用程序。

在 Vue 中,组件 是 Vue 实例的扩展。每个组件都是一个包含有模板、逻辑和样式的独立单元,可以像 HTML 标签一样使用。一个 Vue 应用通常是由多个组件嵌套和组合而成的。

模板:定义组件的结构,通常是 HTML 标记。<template>
脚本:包含组件的业务逻辑,如数据、方法、生命周期钩子等。script>
样式:为组件设置样式,确保其在局部范围内生效。<style scoped>

全局组件:在整个 Vue 实例中都可以访问的组件,通常在入口文件(如 main.js)中注册。
局部组件:只在父组件中注册和使用的组件。

8.父子组件通信

目的是:让父组件控制子组件的行为,或让子组件通知父组件发生了某些事件。

  1. props:用于从父组件向子组件传递数据,子组件可以通过 props 接收到父组件传递的值。
    使用方式:

    • 父组件传递数据:父组件通过 v-bind 或简写 : 将数据传递给子组件(父组件中使用子组件,在子组件上使用)。
    • 子组件接收数据:子组件通过 props 来接收这些数据。
  2. $emit:用于子组件向父组件发送事件。当子组件的某个行为发生时(如按钮点击),子组件可以触发事件,并将数据传递给父组件,父组件可以通过事件处理来响应这些变化。
    使用方式:

    • 子组件触发事件:通过 $emit 在子组件内部触发事件。
    • 父组件监听事件:父组件通过 v-on(或简写 @)来监听子组件的事件(父组件中使用子组件,在子组件上使用)。
  3. ref 允许父组件直接访问子组件的实例(即 Vue 实例本身)。通过 ref,父组件可以调用子组件的公开方法或访问子组件的属性。
    使用方式:

    • 父组件使用 ref:在子组件的标签上使用 ref 属性来标记子组件。
    • 父组件访问子组件实例:通过 this.$refs 获取子组件实例,进而调用子组件的方法或访问子组件的属性。
  4. provideinject 是一种更加灵活的跨级组件通信方式。通过这两个 API,父组件(或祖先组件)可以向子组件(或后代组件)提供数据,而不需要通过逐层的 props 传递。

    • provide:祖先组件提供数据给后代组件。
    • inject:后代组件接收祖先组件通过 provide 提供的数据。
      这种方式适用于需要在多个层级的组件之间共享数据的情况。

9.插槽(Slots)

插槽是 Vue 提供的一种让父组件将内容插入到子组件模板中的机制。插槽(Slot)允许父组件将一些内容插入到子组件的模板中,从而实现更灵活的组件设计。通过插槽,子组件的结构可以在不改变子组件代码的情况下由父组件来决定,增强了组件的可复用性和灵活性。

  1. 默认插槽是最常用的一种插槽,父组件可以在子组件的标签内传递一些内容,子组件通过 <slot></slot> 来渲染这些内容。
  2. 具名插槽允许父组件向子组件传递多个插槽内容,并且每个插槽都可以有一个名字。通过指定 name 属性,可以区分不同的插槽内容。使用方式:
    在子组件中定义多个带 name 属性的插槽;在父组件中通过 v-slotslot 绑定特定名称的内容。(子组件使用带name属性的插槽时可以提供默认内容,类似于默认参数)
  3. 作用域插槽是一种特殊的插槽,它允许子组件向父组件传递数据。父组件通过作用域插槽可以访问子组件提供的数据,并渲染自定义的内容。使用方式:
    子组件通过 slot-scopev-slot 向父组件传递数据。父组件通过作用域插槽接收并使用这些数据。

v-slot 是用于定义和绑定插槽内容的标准语法。它可以用于默认插槽、具名插槽和作用域插槽。

<template v-slot:default><p>This is the default slot content</p>
</template><template v-slot:header><h1>This is the header slot</h1>
</template><template v-slot:default="slotProps"><p>{{ slotProps.message }}</p>
</template>

10.mixins 和 extends(代码复用)

mixins:Mixins 是一种灵活的代码复用机制,可以将组件的选项(如 data、methods、computed 等)提取到一个独立的文件中,然后通过 mixins 将这些选项混入到多个组件中。通过这种方式,可以让不同的组件共享相同的功能,而不需要重复编写相同的代码。

Mixins 本质上是一个包含组件配置对象的 JavaScript 对象。可以创建一个 Mixin 文件(js),定义一些通用的方法、数据;然后在组件中,你可以通过 mixins 选项来引入 Mixin:export default {mixins: [myMixin]} ,如果父组件和 Mixin 中都定义了同样的钩子(如 created),它们都会按顺序执行(先mixin再父组件)。

当多个 Mixins 中有相同的选项(如 data、methods、computed 等),Vue 会合并它们。如果是对象类型,Vue 会进行递归合并。如果是数组,Vue 会进行拼接(如果多个 Mixins 中定义了相同的 data,Vue 会合并它们,而不是覆盖。如果你需要多个 Mixin 中的 data 合并在一起,可以通过返回函数的方式实现);如果是函数,会依照覆盖策略(后面的 Mixin 会覆盖前面的 Mixin 中相同的方法)。生命周期钩子的话是mixin先于父组件。
在 Vue 3 中,推荐使用 Composition API 代替 Mixins。降低耦合性。

extends:类似于 mixins,但是通过 extends 继承组件的选项,可以在子组件中继承父组件的行为。extends 主要是将目标组件的选项合并到当前组件中。这意味着,如果你在目标组件中定义了某些选项(如 data、methods 等),它们会被自动合并到当前组件中。如果当前组件中有相同的选项,它们会覆盖目标组件中的选项。

在使用 extends 时,Vue 会按以下规则来合并选项:

  • data:如果基类和子类都有 data 选项,Vue 会合并它们。如果子类中的 data 返回的是一个对象,它会覆盖基类中的同名属性。如果返回的是一个函数,Vue 会根据返回的函数来合并数据。
  • methods、computed、watchers:如果基类和子类中有相同的方法或计算属性,子类中的方法会覆盖基类中的方法。
  • 生命周期钩子:如果基类和子类都定义了同一个生命周期钩子(如 created),它们会按照引入顺序执行:先执行基类的钩子,再执行子类的钩子。

11. 异步组件

异步组件(Asynchronous Components)是一种延迟加载组件的机制,允许你将组件的加载延迟到它真正需要渲染的时候。这有助于提高应用的性能,尤其是在大型应用中,通过按需加载(懒加载)组件,减少初始加载的资源和时间。

使用Vue.component()定义全局异步组件:

Vue.component('async-example-name', () => import('./AsyncComponent.vue'));

components定义异步组件:

<script>
export default {components: {'async-example': () => import('./components/AsyncComponent.vue')  }
};
</script>

可以设置loadingerrordelay 选项:

const AsyncComponent = () => ({// 需要加载的组件 (异步组件)component: import('./components/AsyncComponent.vue'),// 加载时显示的组件loading: require('./components/LoadingComponent.vue'),// 加载失败时显示的组件error: require('./components/ErrorComponent.vue'),// 最长等待时间delay: 200, // 等待200ms后显示 loading 组件// 超过这个时间认为加载失败,显示 error 组件timeout: 3000 // 超过3秒认为加载失败
});

在这里插入图片描述

12. 动态组件

动态组件(Dynamic Components)允许在运行时根据不同的条件渲染不同的组件。这使得你能够灵活地在同一位置加载不同的组件,而无需显式地写出多个 <component> 标签。

在 Vue 中,动态组件的核心思想是通过 v-bind:is 动态地指定渲染的组件。v-bind:is 可以绑定到一个动态值,这个值可以是组件的名称、对象或函数。动态组件允许在同一个 DOM 元素中切换不同的组件。可以通过 is 属性指定当前展示的组件:

<component :is="currentComponent"></component>

有时你希望每次渲染时都重新创建组件实例,可以使用 key 属性来强制 Vue 销毁并重建组件。

参考

[1] 深入理解MVVM架构模式
[2] vue的diff算法详解(看完谁问都不慌了)
[3] vue-cli ,vue2项目的完整搭建,新建,配置,路由配置,API封装,到打包上线

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

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

相关文章

【在Linux世界中追寻伟大的One Piece】HTTP cookie

目录 1 -> 引入HTTP cookie 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 分类 1.4 -> 安全性 2 -> 认识cookie 2.1 -> 基本格式 2.2 -> GMT vs UTC 3 -> cookie的生命周期 3.1 -> 安全性考虑 3.2 -> 安全测试cookie 3.2.1 -> 测试co…

Echarts使用平面方法绘制三维立体柱状图表

目录 一、准备工作 1.下载引入ECharts库 2.创建容器 二、绘制基本柱状 三、绘制立体柱状方法一 1.定义立方体形状 2.注册立方体形状 3.配置custom系列 4.设置数据 5.渲染图表 四、绘制立体柱状方法二 1.画前知识 2.计算坐标renderItem 函数 &#xff08;1&#x…

考研信息查询系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【…

[高阶数据结构八] B+树和索引原理深度解析

1.前言 B树并不常用,就是因为有B树的存在. MySQL的索引底层其实就是使用了B树,但是B树和索引都是在了解了B树之后才深度学习的&#xff0c;如果你对于B树海一无所知的话&#xff0c;请阅读下面这篇文章。 [高阶数据结构三] B-树详解_b-树csdn-CSDN博客 本章重点&#xff1a; …

Gitee配置以及如何将本地项目提交到远程仓库

文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh&#xff0c;输入以下命令&#xff0c;然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网&#xff1a;https://gitee.com 完成注册 新建仓库 头像->设置-…

圣桥ERP queryForString.dwr SQL注入漏洞复现

0x01 产品描述: 杭州圣乔科技有限公司主要研发全套工业企业ERP系列软件产品,现在公司已经形成ERP 软件、OA办公管理、等四大系列二十小类软件产品。致力于为政府、教育、医疗卫生、文化事业、公共事业(电、水、气等)、交通、住建、应急、金融、电信运营商、企业等用户提供专…

基于MFC框架用C++做一个记账本

目录 一、前言 二、主要功能和技术点 1.主要功能 2.主要技术点 三、准备工作 1.SQLite数据库操作工具 2.SqLiteCpp第三方库 3.安装office导入Excel需要的接口 3.1具体步骤 四、主界面 1.自定义窗口背景 1.1消息映射 1.2选择背景图片 1.3绘制背景 1.4静态控件透明…

qemu搭建aarch64

qemu工具搭建aarch64系统 下载准备 下载qemu: https://qemu.weilnetz.de/w64/2022/qemu-w64-setup-20220831.exe 下载固件&#xff1a;https://publishing-ie-linaro-org.s3.amazonaws.com/releases/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd?Signat…

Zookeeper3.6.3集群安装

Zookeeper3.6.3三节点集群安装 为保证集群高可用&#xff0c;Zookeeper 集群的节点数最好是奇数&#xff0c;最少有三个节点&#xff0c;所以这里搭建一个三个节点的集群。(在一个节点模拟三节点&#xff0c;真实的三节点把ip替换一下即可&#xff0c;按照hadoop案件把网络打通…

下一代 RAG 技术来了!微软正式开源 GraphRAG

省流总结 优点&#xff1a;检索准确度高 缺点&#xff1a;单个19w字构建用时4分30s、gpt4 token花费12美元 概述 7 月 2 日&#xff0c;微软开源了 GraphRAG&#xff0c;一种基于图的检索增强生成 (RAG) 方法&#xff0c;可以对私有或以前未见过的数据集进行问答。在 GitHub…

MySQL索引(四):字符串索引

前缀索引 MySQL是支持前缀索引的&#xff0c; 也就是说&#xff0c; 你可以定义字符串的一部分作为索引。 默认地&#xff0c;如果你创建索引的语句不指定前缀长度&#xff0c; 那么索引就会包含整个字符串。 使用前缀索引的优缺点&#xff1a; 1&#xff09;优点&#xff1a…

获取剪切板的图片 -> File -> Base64 -> Blob -> url -> Image,以及它们之间的各种相互转换

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 一、获取剪切板的图片&#xff08;拿到 File 对象&#xff09; js粘贴事件paste简单解析及遇到的坑 - 云社区 - 腾讯云 (tencent.com) document.addEventListener(paste, f…

实战八:模拟京东购物流程

问题描述&#xff1a; 从键盘录入5个商品信息&#xff08;1001手机&#xff09;添加到商品列表中&#xff0c;展示商品信息,提示用户选择商品&#xff0c;用户选中的商品添加到购物车中&#xff08;购物车中的商品要逆序)&#xff0c;用户选中的商品不存在需要有相应提示&#…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

目录 1、确认浏览器的版本 2、找到对应的chromedriver版本 3、解压chromedriver文件&#xff0c;放置chrome的安装目录下 4、设置系统属性 5、确认chromedriver是否安装成功及解决方式 1、确认浏览器的版本 在浏览器的地址栏&#xff0c;输入chrome://version/&#x…

攻防世界cat-题解

1.打开题目很想是一个命令执行&#xff0c;但是使用命令之心的语句&#xff0c;无法执行命令&#xff0c;看了wp&#xff0c;是在命令执行的时候&#xff1b;被编码了&#xff0c;我们把url%80使它溢出&#xff0c;把显示出来的代码下载到本地分析 分析代码我们可以知道这个是一…

SSM框架

目录 一. Maven入门和进阶 1.Maven简介和快速入门 (1) Maven介绍 (2) Maven的主要作用理解 ①场景概念 ②依赖管理 ③构建管理 (3)Maven安装和配置 ①软件安装 ②环境变量 ③命令测试 ④配置文件&#xff1a; ⑤idea配置本地maven 2.基于IDEA的Maven工程创建 (1…

AI 名人堂:李飞飞

Fei-Fei Li&#xff08;李飞飞&#xff09;&#xff0c;斯坦福大学计算机科学系教授&#xff0c;斯坦福人工智能实验室前主任&#xff0c;以其在人工智能领域的开创性工作而闻名。 人工智能教育的倡导者 计算机视觉领域的领军人物 ImageNet的创造者 2AGI.NET AI 教程 2025最…

基于JavaScript实现的操作系统页面置换算法程序

基于JavaScript的操作系统页面置换算法程序 1. 实验目的 页面置换算法是虚拟存储管理实现的关键&#xff0c;通过本次实验理解内存页面调度的机制&#xff0c;在模拟实现FIFO、LRU等页面置换算法的基础上&#xff0c;比较它们的效率及优缺点&#xff0c;从而了解虚拟存储实现…

JAVA-初始JAVA模块化开发

菜鸟为了巩固所写 目录 菜鸟为了巩固所写 一、概述 二、创建步骤 1、打开Intellij IDEA,创建一个名为MyJavaModuleApp的Java项目。 2、向示例项目中添加”模块描述符“文件 3、创建多模块的IntelliJ 项目 4、IntelliJ项目添加“新模块”对话框 解释1&#xff1a;模块声…

Java 中tableaw 实战教程

java中tableaw库通过简单的API实现过滤、连接、绘制和操作表格数据。支持CSV&#xff0c;数据库&#xff0c;Excel等数据源。 安装依赖 tableaw是用于分析表格数据的开源Java库&#xff0c;构建在Java 8流之上。它可以从GitHub下载&#xff0c;也可以作为Maven或Gradle项目的…