【Vue3从零开始-第三章】3-7 动态组件和异步组件

简介: 【Vue3从零开始-第三章】3-7 动态组件和异步组件

]UWOD(KIB9LJS9~S[T{QHM9.png


前言


上一篇的文章中,我们了解了vue组件中的插槽和具名插槽的方法,今天我们继续深入了解一下vue组件中的动态组件和异步组件


动态组件


在第二章的内容中,我们有了解过动态元素的使用方法,主要是通过v-ifv-show指令来判断一个DOM元素显示还是隐藏。


如果我们要做一个动态组件是不是也可以通过v-ifv-show指令来判断呢?


<script>
  const app = Vue.createApp({
    template: `
      <div>
        <input-item />
        <common-item />
      </div>
    `
  });
  app.component('input-item', {
    template: `
      <div>
        <input />
      </div>
    `
  })
  app.component('common-item', {
    template: `
      <div>
        Hello World
      </div>
    `
  })
  const vm = app.mount('#root');
</script>
复制代码


UX)~JI~[T7I8{_3H8U7PO00.png


首先我们会定义两个全局组件,在根组件中会使用这两个全局子组件,这时候页面上就会显示这两个子组件的内容了。如果想要动态化就可以在子组件标签上使用v-if或者v-show指令了。


const app = Vue.createApp({
    data(){
      return {
        currentItem: 'input-item'
      }
    },
    methods: {
      handleClick(){
        this.currentItem === 'input-item' ? this.currentItem = 'common-item' : this.currentItem = 'input-item'
      }
    },
    template: `
      <div>
        <input-item v-show="currentItem === 'input-item'" />
        <common-item v-show="currentItem === 'common-item'" />
        <button @click="handleClick">切换</button>
      </div>
    `
  });


B0K5)(UG]L]D[MT[{0O_Z]X.png


  • 父组件中调用子组件时,在子组件标签上添加v-show指令用来判断data中的数据值。


  • 通过父组件的切换按钮,来控制v-show指令中的值并判断组件的显示隐藏。




虽然v-show指令已经可以很好的处理动态组件了,但是在vue里面还有一种更简单的方法去处理这种动态组件。


const app = Vue.createApp({
    data() {
      return {
        currentItem: 'input-item'
      }
    },
    methods: {
      handleClick() {
        this.currentItem === 'input-item' ? this.currentItem = 'common-item' : this.currentItem = 'input-item'
      }
    },
    template: `
      <div>
        <component :is="currentItem" />
        <button @click="handleClick">切换</button>
      </div>
    `
  });
复制代码


B0K5)(UG]L]D[MT[{0O_Z]X.png


  • 父组件中将子组件标签移除,替换成component标签。


  • component标签中绑定一个is属性,属性值就是data中定义的数据值currentItem


  • 使用component标签来做动态组件的操作,会使代码更加精简。


动态组件:根据数据的变化,结合component标签来随时动态切换组件的显示


异步组件


不管是上面的动态组件代码,还是以前的组件通信代码,都是一个同步执行并渲染的过程,也就是当页面加载的时候,组件都会一起渲染出来。


如果想要对某些组件进行延迟渲染,就得用到异步组件了。


定义异步组件会用到vue里面的defineAsyncComponent方法,在这个方法里面可以定义一个Promise去异步执行一个组件代码。


<script>
  const app = Vue.createApp({
    template: `
      <div>
        <common-item />
        <async-common-item />
      </div>
    `
  });
  app.component('common-item', {
    template: `
      <div>
        Hello World
      </div>
    `
  })
  app.component('async-common-item', Vue.defineAsyncComponent(() => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({
          template: `
            <div>
              这里会延迟加载!
            </div>
          `
        })
      }, 5000)
    })
  }))
  const vm = app.mount('#root');
</script>
复制代码


_9W4U{3WB2OJILKI0GX87J1.png


  • common-item组件就是一个同步组件,会跟随页面一同被渲染出来。


  • async-common-item组件后面调用了Vue.defineAsyncComponent方法,在方法里面隔了5秒的时间去渲染这个组件。


异步组件:异步执行某些组件的逻辑。


总结


本篇文章主要讲了动态组件和异步组件的用法,在实际项目中,渲染同步组件会更多一些,异步组件相对运用的地方较少。但还是希望大家可以了解一下异步组件的用法,说不定某一天在项目中就碰到了。

相关文章
|
9天前
vue3学习(3)
vue3学习(3)
|
6天前
|
JavaScript API
Vue3中的计算属性能否动态修改
【9月更文挑战第5天】Vue3中的计算属性能否动态修改
38 10
|
2天前
|
前端开发
vue3+ts项目中使用mockjs
vue3+ts项目中使用mockjs
186 57
|
6天前
|
JavaScript API
如何使用Vue3的可计算属性
【9月更文挑战第5天】如何使用Vue3的可计算属性
40 13
|
6天前
|
资源调度 JavaScript API
vue3 组件通信方式
vue3 组件通信方式
36 11
|
6天前
|
缓存 JavaScript API
Vue3— computed的实现原理
【9月更文挑战第5天】Vue3— computed的实现原理
27 10
|
8天前
|
存储 JavaScript 前端开发
Vue 3的响应式系统是如何工作的呢
【9月更文挑战第3天】Vue 3的响应式系统是如何工作的呢
20 4
|
8天前
|
缓存 JavaScript API
介绍一下Vue 3的响应式系统
【9月更文挑战第3天】介绍一下Vue 3的响应式系统
26 3
|
9天前
|
JavaScript
vue3学习(2)
vue3学习(2)
|
8天前
|
JavaScript 前端开发 编译器
对Vue2 与 Vue3 的区别的理解
【9月更文挑战第3天】对Vue2 与 Vue3 的区别的理解
17 0