【Vue3 从入门到实战 进阶式掌握完整知识体系】017-探索组件的理念:动态组件和异步组件

8、动态组件和异步组件

动态组件

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>hello vue</title>
  <!-- 引入Vue库 -->
  <script src="https://unpkg.com/vue@next"></script>
</head>

<body>
  <div id="root"></div>
</body>

<script>
  const app = Vue.createApp({
    data(){
      return{
        currentItem: 'input-item'
      }
    },
    methods:{
      shift(){
        if(this.currentItem === 'input-item'){
          this.currentItem = 'common-item'
        }else{
          this.currentItem = 'input-item'
        }
      }
    },
    template: `
        <div>
          <!--这么写太麻烦了,我们来精简一下-->
          <!--<input-item v-show="this.currentItem === 'input-item'" />-->
          <!--<common-item v-show="this.currentItem === 'common-item'" />-->
          <component :is="currentItem" />
          <button @click="shift()">切换</button>
        </div>
    `
  });

  
  app.component('input-item',{
    template: `
        <input />
    `
  });

  app.component('common-item',{
    template: `
        <div>hello world!</div>
    `
  });

  const vm = app.mount('#root');
</script>

</html>

运行结果

image-20210613184438395.png

内容缓存

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>hello vue</title>
  <!-- 引入Vue库 -->
  <script src="https://unpkg.com/vue@next"></script>
</head>

<body>
  <div id="root"></div>
</body>

<script>
  const app = Vue.createApp({
    data(){
      return{
        currentItem: 'input-item'
      }
    },
    methods:{
      shift(){
        if(this.currentItem === 'input-item'){
          this.currentItem = 'common-item'
        }else{
          this.currentItem = 'input-item'
        }
      }
    },
    template: `
        <div>
          <!--这么写太麻烦了,我们来精简一下-->
          <!--<input-item v-show="this.currentItem === 'input-item'" />-->
          <!--<common-item v-show="this.currentItem === 'common-item'" />-->
          <!--内容缓存-->
          <keep-alive>
            <component :is="currentItem" />
          </keep-alive>
          <button @click="shift()">切换</button>
        </div>
    `
  });

  
  app.component('input-item',{
    template: `
        <input />
    `
  });

  app.component('common-item',{
    template: `
        <div>hello world!</div>
    `
  });

  const vm = app.mount('#root');
</script>

</html>

运行结果

image-20210613184819809.png

异步组件

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>hello vue</title>
  <!-- 引入Vue库 -->
  <script src="https://unpkg.com/vue@next"></script>
</head>

<body>
  <div id="root"></div>
</body>

<script>
  const app = Vue.createApp({
    data(){
      return{
        currentItem: 'input-item'
      }
    },
    template: `
        <div>
          <!--同步组件:顺序执行-->
          <common-item />
          <!--异步组件:需要时执行-->
          <async-common-item />
        </div>
    `
  });

  // 异步组件
  app.component('async-common-item', Vue.defineAsyncComponent( () => {
    return new Promise((resolve, reject) => {
      // 定时执行:4秒后执行
      setTimeout(() => {
        // 成功时执行
        resolve({
          template: `
            <div>这是一个异步组件!</div>
          `
        })
      }, 4000);
    })
  }))
  
  // 同步组件
  app.component('common-item',{
    template: `
        <div>hello world!</div>
    `
  });

  const vm = app.mount('#root');
</script>

</html>

运行结果

image-20210613190328421.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值