目录
一、前言
1-1.三点变化:
1-2.引入辅助函数defineAsyncComponent的原因:
二、Vue 2.x与Vue 3.x定义比较
2-1.异步组件/路由定义比较
2-2.声明方式比较
2-3.异步组件加载函数返回比较
三、Vue3实践
3-1.路由懒加载实现
3-2.异步组件实现
首页 web前端 Vue.js vue3 vite异步组件及路由懒加载怎么应用

vue3 vite异步组件及路由懒加载怎么应用

May 18, 2023 pm 04:52 PM
vue3 vite

一、前言

1-1.三点变化:

  • 异步组件声明方法的改变:Vue 3.x 新增一个辅助函数defineAsyncComponent,用来显示声明异步组件

  • 异步组件高级声明方法中的 component 选项更名为loader

  • loader绑定的组件加载函数不再接收resolve和reject参数,而且必须返回一个Promise

1-2.引入辅助函数defineAsyncComponent的原因:

现在,在 Vue 3 中,由于函数组件被定义为纯函数,异步组件定义需要通过将其包装在一个新的 defineAsyncComponent helper 中来显式定义。

二、Vue 2.x与Vue 3.x定义比较

2-1.异步组件/路由定义比较

  • 2-1-1.在 Vue 2.x 中,声明一个异步组件只需这样:

const asyncPage = () => import('./views/home.vue')
登录后复制
登录后复制
  • 2-1-2.在 Vue 3.x 中,异步组件的导入需要使用辅助函数defineAsyncComponent来进行显式声明。如下:

<template>
  <div>
    <h2>Async Components</h2>
    <p>异步组件测试</p>
    <child />
  </div>
</template>
<script>
import { defineAsyncComponent } from &#39;vue&#39;
const child = defineAsyncComponent(() => import(&#39;@/components/async-component-child.vue&#39;))
export default {
  name: &#39;async-components&#39;,
  components:{
    &#39;child&#39;: child
  }
};
</script>
登录后复制

2-2.声明方式比较

  • 2-2-1.Vue 2.x中异步组件的声明有更高级的声明方式。如下:

const asyncPageWithOptions  = {
  component: () => import(&#39;./views/home.vue&#39;),
  delay: 200,
  timeout: 3000,
  error: ErrorComponent,
  loading: LoadingComponent
}
登录后复制

所以,下面的异步组件声明:

const asyncPage = () => import(&#39;./views/home.vue&#39;)
登录后复制
登录后复制

等价于:

const asyncPageWithOptions  = {
  component: () => import(&#39;./views/home.vue&#39;)
}
登录后复制
  • 2-2-2.Vue 3.x中也可以这样声明异步组件。只是其中的component需要改为loader。如下:

const asyncPageWithOptions  = defineAsyncComponent({
  loader: () => import(&#39;./views/home.vue&#39;),
  delay: 200,
  timeout: 3000,
  error: ErrorComponent,
  loading: LoadingComponent
})
登录后复制

2-3.异步组件加载函数返回比较

  • 2-3-1.在Vue 2.x中接收resolve和reject:

// 2.x version
const oldAsyncComponent = (resolve, reject) => {
  /* ... */
}
登录后复制
  • 2-3-2.在Vue 3.x中始终返回Promise:

// 3.x version
const asyncComponent = defineAsyncComponent(
  () => new Promise((resolve, reject) => {
      /* ... */
  })
)
登录后复制

Vue 3.x的异步组件加载函数将不再接收resolve和reject,而且必须始终返回Promise。换句话说,在Vue 3.x中,不再支持通过工厂函数接收resolve回调来定义异步组件。

// 在 Vue 3.x 中不适用
export default {
  components: {
    asyncPage: resolve => require([&#39;@/components/list.vue&#39;], resolve)
  },
}
登录后复制

三、Vue3实践

提示: 如果是用vite工具来构建项目,在本地开发使用import做路由懒加载,可以正常加载,但是会报警告;打包到生产环境会报错,页面不会正常展示,可以使用以下两种方法来实现。

3-1.路由懒加载实现

  • 3-1-1.defineAsyncComponent方法

// router/index.js
import { defineAsyncComponent } from &#39;vue&#39;
const _import = (path) => defineAsyncComponent(() => import(`../views/${path}.vue`));
const routes = [
  {
    path: &#39;/async-component&#39;,
    name: &#39;asyncComponent&#39;,
    component: _import(&#39;home&#39;),
  }
];
登录后复制
  • 3-1-2.import.meta.glob方法

// 1.上面的方法相当于一次性加载了 views 目录下的所有.vue文件,返回一个对象
const modules = import.meta.glob(&#39;../views/*/*.vue&#39;);
const modules ={
    "../views/about/index.vue": () => import("./src/views/about/index.vue")
}
// 2.动态导入的时候直接,引用
const router = createRouter({
  history: createWebHistory(),
  routes: [
    // ...
    {
      path: &#39;xxxx&#39;,
      name: &#39;xxxxx&#39;,
      // 原来的方式,这个在开发中可行,但是生产中不行
      // component: () => import(`../views${menu.file}`),
      // 改成下面这样
      component: modules[`../views${filename}`]
    }
    // ...          
  ],
})
登录后复制

3-2.异步组件实现

<template>
  <div>
    <h2>Async Components</h2>
    <p>异步组件测试</p>
    <child></child>
  </div>
</template>
<script>
import { defineAsyncComponent } from &#39;vue&#39;
const child = defineAsyncComponent(() => import(&#39;@/components/async-component-child.vue&#39;))
export default {
  name: &#39;async-components&#39;,
  components:{
    &#39;child&#39;: child
  }
};
</script>
登录后复制

以上是vue3 vite异步组件及路由懒加载怎么应用的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Vue3+TS+Vite开发技巧:如何进行SEO优化 Vue3+TS+Vite开发技巧:如何进行SEO优化 Sep 10, 2023 pm 07:33 PM

Vue3+TS+Vite开发技巧:如何进行SEO优化SEO(SearchEngineOptimization)是指通过优化网站的结构、内容和关键词等方面,使其在搜索引擎的排名更靠前,从而增加网站的流量和曝光度。在Vue3+TS+Vite等现代前端技术的开发中,如何进行SEO优化是一个很重要的问题。本文将介绍一些Vue3+TS+Vite开发的技巧和方法,帮

vue3+vite:src使用require动态导入图片报错怎么解决 vue3+vite:src使用require动态导入图片报错怎么解决 May 21, 2023 pm 03:16 PM

vue3+vite:src使用require动态导入图片报错和解决方法vue3+vite动态的导入多张图片vue3如果使用的是typescript开发,就会出现require引入图片报错,requireisnotdefined不能像使用vue2这样imgUrl:require(’…/assets/test.png’)导入,是因为typescript不支持require所以用import导入,下面介绍如何解决:使用awaitimport

Vue3如何实现刷新页面局部内容 Vue3如何实现刷新页面局部内容 May 26, 2023 pm 05:31 PM

想要实现页面的局部刷新,我们只需要实现局部组件(dom)的重新渲染。在Vue中,想要实现这一效果最简便的方式方法就是使用v-if指令。在Vue2中我们除了使用v-if指令让局部dom的重新渲染,也可以新建一个空白组件,需要刷新局部页面时跳转至这个空白组件页面,然后在空白组件内的beforeRouteEnter守卫中又跳转回原来的页面。如下图所示,如何在Vue3.X中实现点击刷新按钮实现红框范围内的dom重新加载,并展示对应的加载状态。由于Vue3.X中scriptsetup语法中组件内守卫只有o

Vue3+TS+Vite开发技巧:如何进行前端安全防护 Vue3+TS+Vite开发技巧:如何进行前端安全防护 Sep 09, 2023 pm 04:19 PM

Vue3+TS+Vite开发技巧:如何进行前端安全防护随着前端技术的不断发展,越来越多的企业和个人开始使用Vue3+TS+Vite进行前端开发。然而,随之而来的安全风险也引起了人们的关注。在本文中,我们将探讨一些常见的前端安全问题,并分享一些在Vue3+TS+Vite开发过程中如何进行前端安全防护的技巧。输入验证用户的输入往往是前端安全漏洞的主要来源之一。在

Vue3+TS+Vite开发技巧:如何进行跨域请求和网络请求优化 Vue3+TS+Vite开发技巧:如何进行跨域请求和网络请求优化 Sep 09, 2023 pm 04:40 PM

Vue3+TS+Vite开发技巧:如何进行跨域请求和网络请求优化引言:在前端开发中,网络请求是非常常见的操作。如何优化网络请求以提高页面加载速度和用户体验是我们开发者需要思考的问题之一。同时,对于一些需要向不同域名发送请求的场景,我们需要解决跨域问题。本文将介绍如何在Vue3+TS+Vite开发环境下进行跨域请求以及网络请求的优化技巧。一、跨域请求解决方案使

Vue3怎么解析markdown并实现代码高亮显示 Vue3怎么解析markdown并实现代码高亮显示 May 20, 2023 pm 04:16 PM

Vue实现博客前端,需要实现markdown的解析,如果有代码则需要实现代码的高亮。Vue的markdown解析库有很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked,代码高亮的库选用的是highlight.js。具体实现步骤如下:一、安装依赖库在vue项目下打开命令窗口,并输入以下命令npminstallmarked-save//marked用于将markdown转换成htmlnpmins

Vue3+TS+Vite开发技巧:如何进行数据加密和存储 Vue3+TS+Vite开发技巧:如何进行数据加密和存储 Sep 10, 2023 pm 04:51 PM

Vue3+TS+Vite开发技巧:如何进行数据加密和存储随着互联网技术的快速发展,数据的安全性和隐私保护变得越来越重要。在Vue3+TS+Vite开发环境下,如何进行数据加密和存储,是每个开发人员都需要面对的问题。本文将介绍一些常用的数据加密和存储的技巧,帮助开发人员提升应用的安全性和用户体验。一、数据加密前端数据加密前端加密是保护数据安全性的重要一环。常用

怎么使用vue3+ts+axios+pinia实现无感刷新 怎么使用vue3+ts+axios+pinia实现无感刷新 May 25, 2023 pm 03:37 PM

vue3+ts+axios+pinia实现无感刷新1.先在项目中下载aiXos和pinianpmipinia--savenpminstallaxios--save2.封装axios请求-----下载js-cookienpmiJS-cookie-s//引入aixosimporttype{AxiosRequestConfig,AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

See all articles