Vue3组件化开发之动态异步组件,生命周期,组件v-model等(十二)

955 阅读5分钟

1.动态组件

动态组件是使用 component 组件,通过一个特殊的属性 is 来实现

比如我们现在要实现点击一个tab-bar,切换不同的组件显示

image-20220201140919832

实现一:通过v-if判断

image-20220201135845639

实现二:动态组件

image-20220201141011310

注意::is的值必须是全局或者局部注册的组件

如果我们实现动态组件的相互通信可以直接给component传递porps或者监听emit事件

image-20220201142036638

页面显示:

image-20220201142054067

2.keep-alive

开发中某些情况我们希望继续保持组件的状态,而不是销毁掉,这个时候我们就可以使用一个内置组件keep-alive

此时我们在上面的案例中增加一个按钮计数,我们希望给切换组件再回来的时候计数的状态不会丢失

image-20220201143635818

keep-alive属性

pinclude - string | RegExp | Array。只有名称匹配的组件会被缓存

exclude - string | RegExp | Array。任何名称匹配的组件都不会被缓存

max - number | string。最多可以缓存多少组件实例,一旦达到这个数字,那么缓存组件中最近没有被访问的实例会被销毁

include和 exclude 匹配时首先会检查组件自身的 name 选项:

image-20220201150618247

缓存组件的生命周期

缓存的组件,再次进入时是不会执行created或者mounted等生命周期函数的

我们如果需要监听何时离开或者重进了该组件,我们可以使用activateddeactivated 这两个生命周期钩子函数来监听

image-20220201151010691

3.Webpack的代码分包

默认情况下,在构建整个组件树的过程中,因为组件和组件之间是通过模块化直接依赖的,那么webpack在打包时就会将组件模块打包到一起(比如一个app.js文件中)

当随着着项目的不断庞大,app.js文件的内容过大,会造成首屏的渲染速度变慢

对于一些不需要立即使用的组件,我们可以单独对它们进行拆分,拆分成一些小的代码块chunk.js

这些chunk.js会在需要时从服务器加载下来,并且运行代码,显示对应的内容

image-20220201151658851

4.异步组件

在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载

对于某些组件希望通过异步的形式加载,那 么Vue中给我们提供了一个defineAsyncComponent函数

defineAsyncComponent函数接受两种类型参数

  1. 工厂函数,该工厂函数需要返回一个Promise对象
  2. 接受一个对象类型,对异步函数进行配置

工厂函数,写法一:

image-20220201201548851

接受一个对象类型,对异步函数进行配置,写法二:

image-20220201205555086

5.元素和组件的引用

$refs

在Vue组件中想要直接获取到元素对象或者子组件实例,不推荐DOM操作,我们可以给元素或组件绑定一个ref的属性

应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象

image-20220201215442351

refv-for 中使用时,相应的 ref 中包含的值是一个数组:

image-20220201220651687

parentparent和root

Vue3中已经移除了$children的属性

我们可以通过$parent来访问父元素

$root获取对应的根组件

image-20220201220158706

6.生命周期

又名:生命周期回调函数、生命周期函数、生命周期钩子

Vue在关键时刻帮我们调用的一些特殊名称的函数

通过对生命周期函数的回调,我们可以知道目前组件正在经历什么阶段,在对应阶段做对应操作

生命周期

image-20220201221631085

常用的生命周期钩子:

  • mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】
  • beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】

关于销毁Vue实例

  • 销毁后借助Vue开发者工具看不到任何信息
  • 自定义事件会失效,但原生DOM事件依然有效
  • 一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了

7.组件的v-model

之前使用input的v-model实现双向数据绑定,因为为v-model默认帮助我们完成了两件事

v-bind:value的数据绑定和@input的事件监听

如今我们封装一个input组件也同样可以完成这个功能

使用的父组件:

image-20220201225043823

yunInput组件:

image-20220201225951172

如果我们希望组件内部依然使用v-model来实现,可以使用计算属性的setter和getter 来完成

image-20220201230826038

默认情况下的v-model其实是绑定了 modelValue 属性和 @update:modelValue的事件

此外绑定多个v-model,此处v-model:title相当于绑定了title属性和监听了 @update:title 的事件

image-20220201232258007

8.Mixin

如果我们希望对代码中的相同逻辑抽离

Vue2和Vue3中都支持的一种方式就是使用Mixin来完成

Mixin可以包含任何组件选项,当组件使用Mixin对象时,所有Mixin对象的选项将被混合进入该组件本身的选项中

局部混入

image-20220201234422236

全局混入

如果组件中的某些选项,是所有的组件都需要拥有的,那么这个时候我们可以使用全局的mixin

全局的Mixin可以使用 应用app的方法 mixin 来完成注册

一旦注册,那么全局混入的选项将会影响每一个组件

image-20220201234629343

Mixin的合并规则

如果Mixin对象中的选项和组件对象中的选项发生了冲突,要分为不同情况

  1. 如果是data函数的返回值默认情况下会进行合并,如果冲突,则保留组件自身数据
  2. 生命周期的钩子函数会被合并到数组中,都会被调用
  3. 值为对象的选项,例如 methods、components 和 directives,将被合并为同一个对象,如果产生冲突,依然以组件自身为主