Vue加载组件、动态加载组件的几种方式

当使用Vue框架进行开发时,可能会遇到需要动态加载组件的情况。Vue框架提供了一些方式来满足这种需求。

加载组件的几种方式

1. 直接注册组件

Vue框架提供了全局注册和局部注册两种方式。

1.1 全局注册方式

在全局注册中,通过 Vue.component() 方法注册组件。这种方式适用于组件会在项目的不同位置多次使用。

// 定义组件: todo-list.vue
<template>
  <ul>
    <li v-for="(todo, index) in todos" :key="index">
      {{ todo }}
    </li>
  </ul>
</template>

<script>
  export default {
    // 接收父组件传递的属性值
    props: ['todos']
  }
</script>

// 在应用中进行全局注册
import Vue from 'vue'
import TodoList from './components/todo-list.vue'

Vue.component('todo-list', TodoList)

全局注册后,在任何组件的 template 标签中都可以直接通过 "" 标签使用该组件。

1.2 局部注册方式

如果组件仅在某个组件内使用,那么可以使用局部注册的方式,不需要进行全局注册。

// 定义组件: todo-list.vue
<template>
  <ul>
    <li v-for="(todo, index) in todos" :key="index">
      {{ todo }}
    </li>
  </ul>
</template>

<script>
  export default {
    // 接收父组件传递的属性值
    props: ['todos']
  }
</script>

// 在应用中进行局部注册
import TodoList from './components/todo-list.vue'

export default {
  components: {
    'todo-list': TodoList
  }
}
2. 动态加载组件

有时候我们需要根据运行时的条件来动态加载组件。可以通过 Vue 的异步组件和Webpack的代码分割功能来实现动态加载。

2.1 异步组件

Vue框架支持使用 import() 函数来异步加载组件。

例如,有一个App.vue组件,在该组件需要动态引入Child1.vue和Child2.vue两个子组件。

<template>
    <div>
        <component :is="currentComp" />
        <button @click="changeChild">Click to change child component</button>
    </div>
</template>

<script>
import Child1 from './components/Child1.vue'
import Child2 from './components/Child2.vue'

export default {
    components: {
        Child1,
    },
    data () {
        return {
            currentComp: 'Child1'
        }
    },
    methods: {
        changeChild() {
            this.currentComp = this.currentComp === 'Child1' ? 'Child2' : 'Child1'
        }
    }
}
</script>

这里的 component 标签是用来加载动态组件的,另外在 data 中定义了一个 currentComp 变量,用来控制当前加载组件的值。

在Webpack编译时,将会把Child1.vueChild2.vue 编译成单独的JS文件。 在实际需要使用时,可以通过 import() 方法异步加载文件。

<template>
    <div>
        <component :is="currentComp" />
        <button @click="changeChild">Click to change child component</button>
    </div>
</template>

<script>
export default {
    data () {
        return {
            currentComp: 'Child1'
        }
    },
    methods: {
        changeChild () {
            if (this.currentComp === 'Child1') {
                import('./components/Child2.vue').then(child => {
                    this.currentComp = child.default
                })
            } else {
                import('./components/Child1.vue').then(child => {
                    this.currentComp = child.default
                })
            }
        }
    }
}
</script>

这里通过 import() 方法异步加载 Child1.vueChild2.vue 组件,并根据当前的 currentComp 值来进行切换。

3. Vue内置异步组件

Vue框架提供了一种更简单的方式来实现异步组件,就是使用 <async-component> 标签,该标签会自动进行异步加载。

首先,需要安装 vue-async-component 插件。

npm install vue-async-component

安装后,在项目中就可以使用 <async-component> 标签进行动态加载组件。

例如,有一个App.vue组件,在该组件需要动态引入Child1.vue和Child2.vue两个子组件。

<template>
    <div>
        <async-component :name="currentComp" :load="loadComp"/>
        <button @click="changeChild">Click to change child component</button>
    </div>
</template>

<script>
import Child1 from './components/Child1.vue'
import Child2 from './components/Child2.vue'
import VueAsyncComponent from 'vue-async-component'

export default {
    components: {
        Child1,
        Child2,
        asyncComponent: VueAsyncComponent
    },
    data () {
        return {
            currentComp: 'Child1'
        }
    },
    methods: {
        loadComp (name, cb) {
            if (name === 'Child1') {
                cb(Child1)
            } else {
                cb(Child2)
            }
        },
        changeChild () {
            this.currentComp = this.currentComp === 'Child1' ? 'Child2' : 'Child1'
        }
    }
}
</script>

这里动态加载时使用了 VueAsyncComponent 插件,<async-component> 标签就是该插件提供的。在组件加载时,会根据名称触发 loadComp 方法,实现异步加载。在这个示例中,将加载 Child1.vueChild2.vue 组件,并根据当前的 currentComp 值来进行切换。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue加载组件、动态加载组件的几种方式 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • vue使用vite配置跨域以及环境配置详解

    Vue使用Vite配置跨域以及环境配置详解 在Vue应用中,我们经常会遇到需要跨域请求接口的场景。同时,在不同的环境中,还需要配置不同的API地址。为了解决这些问题,我们可以使用Vite构建工具,并通过Vite提供的配置来实现跨域和环境配置。 跨域配置 在Vite中,我们可以通过proxy来实现跨域请求。首先,在项目根目录下创建vite.config.js文…

    Vue 2023年5月28日
    00
  • Vue 开发必须知道的36个技巧(小结)

    Vue 开发必须知道的36个技巧(小结) 本文总结了36个Vue开发中必须知道的技巧,内容涵盖了组件开发、状态管理、路由导航、性能优化等多个方面的技巧。 组件开发篇 Tip1:合理使用computed computed是一个非常强大的特性,但也有很多约束,比如它会缓存计算结果;还要注意它不应该有任何副效应,也不应该修改任何数据。所以,在使用computed …

    Vue 2023年5月27日
    00
  • Vue自定义指令介绍(2)

    下面为你详细讲解Vue自定义指令介绍(2)的完整攻略。 什么是自定义指令 自定义指令是 Vue 框架中的一种扩展,允许开发者在模板中以 v-xxx 的格式自定义指令,指令的定义和实现可以是全局的或局部的,并且可以带有参数和修饰符。 自定义指令主要有两种用途: 增强已有的 DOM 元素; 提供组件的行为和样式。 自定义指令的定义 自定义指令的定义通过 Vue.…

    Vue 2023年5月27日
    00
  • vue实现虚拟列表组件解决长列表性能问题

    Vue是一个流行的JavaScript框架,其易于使用和高度灵活的特性使得在前端开发中广泛应用。但是在处理长列表时,用Vue来渲染数据容易导致页面性能下降,尤其是在移动浏览器中。为了提高Vue性能,在Vue官方文档中提供了一种解决长列表性能问题的机制,那就是使用算法实现虚拟列表,从而避免渲染大量无意义数据。本文将详细介绍如何使用Vue实现虚拟列表组件,包括以…

    Vue 2023年5月27日
    00
  • 浅谈在vue-cli3项目中解决动态引入图片img404的问题

    首先,出现图片404错误的原因可能有多种,但在vue-cli3项目中常见的错误是因为在引入图片时直接使用了相对路径而导致的。 解决这个问题的方法是使用require语法,在vue组件中通过require引入图片文件,再通过绑定v-bind:src动态绑定图片的路径,即可避免出现404错误。 具体的步骤如下: 下载并安装file-loader 在项目中使用re…

    Vue 2023年5月28日
    00
  • Vue中动态class的多种写法

    当我们在Vue中需要动态地给元素添加或切换class时,可以使用以下多种写法: 1. 对象语法 使用对象语法可以动态地添加或删除多个class。 示例代码: <template> <div v-bind:class="{ activated: isActive, ‘text-danger’: hasError }"&gt…

    Vue 2023年5月27日
    00
  • vue源码学习之Object.defineProperty对象属性监听

    下面我来详细讲解“vue源码学习之Object.defineProperty对象属性监听”的完整攻略。 标题 vue源码学习之Object.defineProperty对象属性监听 简介 在开发Vue.js过程中,我们经常会用到Object.defineProperty方法来实现数据响应式,也就是监听对象属性的变化。Vue.js源码中就使用了该方法来实现数据…

    Vue 2023年5月28日
    00
  • 98道经典Vue面试题总结

    感谢您对本网站的关注,以下是关于《98道经典Vue面试题总结》的完整攻略。 一、前言 Vue.js 是一款流行的前端框架,已经成为很多企业和公司的项目必备技术。但是随着 Vue 的普及,Vue 面试题也越来越多,Vue 面试有可能会考到一些比较深入的知识点。因此,对于很多初学者来说,学习 Vue 的同时,也要去了解一些常见的面试题。 本篇文档涵盖了98道面试…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部