美文网首页前端/后端
【Vue3 从入门到实战 进阶式掌握完整知识体系】017-探索组

【Vue3 从入门到实战 进阶式掌握完整知识体系】017-探索组

作者: 訾博ZiBo | 来源:发表于2021-07-01 20:26 被阅读0次

    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

    相关文章

      网友评论

        本文标题:【Vue3 从入门到实战 进阶式掌握完整知识体系】017-探索组

        本文链接:https://www.haomeiwen.com/subject/bkxlultx.html