首页 > 其他分享 >vue3 基础-动态组件 & 异步组件

vue3 基础-动态组件 & 异步组件

时间:2022-09-22 00:14:57浏览次数:63  
标签:异步 app component item template vue3 组件

之前学习的都是父子组件传值的话题, 一句话总结就是, 常规数据通过属性传, dom 结构通过插槽 slot 来传. 而本篇则关注如何通过数据去控制组件的显示问题, 如咱经常用到的页面切换呀, Tab 栏切换之类的, 就会涉及到组件的显示和隐藏以及同步或者异步任务的问题啦.

动态组件

即可根据数据变化, 结合 component 标签 动态切换组件显示.

<!DOCTYPE html>
<html lang="en">
<head>
  <title>动态组件的引入</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
    // 组件1 是一个输入框    
    app.component('input-item', {
      template: `
      <input />
      `
    })
	// 组件2 是一个div显示文本
    app.component('common-item', {
      template: `<div>hello, world</div>`
    })
    
    const vm = app.mount('#root')

  </script>
</body>

</html>

需求就是希望能通过数据 data ( ) 去控制两个组件的显示和隐藏. 其靠咱朴素的写法实现如下:

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

<head>
  <title>动态组件-朴素实现</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      data () {
        return { current: 'input-item' }
      },
      methods: {
        handleClick () {
          if (this.current === 'input-item') {
            this.current = 'common-item'
          } else {
            this.current = 'input-item'
          }
        }
      },
      template: `
      <input-item v-show="current === 'input-item'" />
      <common-item v-show="current === 'common-item'" />
      <button @click="handleClick">切换</button>
      `
    })

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

    app.component('common-item', {
      template: `<div>hello, world</div>`
    })
    
    const vm = app.mount('#root')

  </script>
</body>

</html>

这样写的缺点在于有点复杂和冗余, 为简洁起见, vue 就封装了一个名为 component 标签来优化这个写法:

// 用: 
template: `
    <component :is="current" />
    <button @click="handleClick">切换</button>
    `

// 来替换
template: `
    <input-item v-show="current === 'input-item'" />
    <common-item v-show="current === 'common-item'" />
    <button @click="handleClick">切换</button>
    `

针对再切换来组件, 还可以通过外套一个 keep-alive 的标签实现之前组件数据的临时缓存.

template: `
    <keep-alive>
        <component :is="current" />
    </keep-alive>
    <button @click="handleClick">切换</button>
    `

异步组件

先还是要区分"同步和异步"的概念, 计算机中的同步和我们现实生活是恰好相反的.在现实生活中, "俺同时在开会和想她" 这种同步的一心多用, 在计算机中叫 "异步"; "我打开电脑再摸鱼" 这种有先后顺序的, 在计算机中叫 "同步".

更形象一点从来显示一波同步组件, 即当父组件调用的时候, 子组件就会按顺序执行, 这就是同步.

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

<head>
  <title>同步组件</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      template: `
      <Son />
      `
    })

    app.component('Son', {
      template: `<div>我是同步组件, 父组件调用的时候就会按顺序执行</div>`
    })
    
    const vm = app.mount('#root')

  </script>
</body>

</html>

则异步组件就是不按顺序从上到下执行, 可是延迟或者同时进行, 哎呀异步任务吗, 这个有啥可解释的.

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

<head>
  <title>异步组件</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      template: `
      <Son />
      <async-item />
      `
    })

    // 同步组件
    app.component('Son', {
      template: `<div>我是同步组件</div>`
    })

    // 异步组件, 这里以每隔3秒执行一波测试
    app.component('async-item', Vue.defineAsyncComponent(
      () => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve({
              template: `<div>我是一个异步组件</div>`
            })
          }, 2000);
        })
      }
    ))
    

    
    const vm = app.mount('#root')

  </script>
</body>

</html>

小结

  • 复习组件传值技巧: 常规数据通过属性传, dom 结构通过插槽 slot 传
  • 动态组件的理解是通过数据来控制组件的显示, 可通过 component 和 keep-alive 标签实现
  • 计算机世界的同步即按顺序执行任务, 异步则可以同时进行多个处理 "既想她, 也想他"
  • 异步组件实现可以通过 Vue.defineAsyncComponent ( ) 加一个 Promise 来实现呀

标签:异步,app,component,item,template,vue3,组件
From: https://www.cnblogs.com/chenjieyouge/p/16717708.html

相关文章

  • 搜狗workflow异步调度框架
    搜狗workflow异步调度框架参考https://www.zhihu.com/column/c_1456603443661643776来源 https://zhuanlan.zhihu.com/p/172485495虽然我更新本博客比较慢,但是github......
  • 基本组件之 UISprite 面板控制
    1基本组件之UISprite面板控制1.1.UISprite显示图片①创建UISprite组件,步骤:NGUI-->Create-->Sprite;②选择图集,选择要显示的图片;\③Widget中点击“Snap”按钮,让......
  • vue学习笔记(二):vue目录结构,及vue组件和用法
    一、目录结构: 二、vue组件:  项目目录中的app.vue是一个顶级组件,可以删除里面的代码,然后来重新写:  注意:<template>标签下面只能有一个根元素,也就是说下面的写......
  • Axure RP大数据可视化大屏原型组件源文件
    AxureRP大数据可视化大屏原型模板大数据BI分析上大屏,在很多大企业和政府单位客户都需要,高新区市场监控等,那使用AxureRP做交互原型是必不可少的,有了大屏原型模板可做出不......
  • Vue3 Echarts 省地图
    一、效果 二、echarts的安装npminstallecharts三、echarts各省份地图js导入以下是别人下载好的各省份的数据,可以直接下载使用,放在项目js文件夹下,在页面内引入。......
  • react-antd组件之Steps组件自定义icon svg图片颜色跟随完成进度改变
    demo.svg<?xmlversion="1.0"encoding="UTF-8"?><svgwidth="58px"height="44px"viewBox="005844"version="1.1"xmlns="http://www.w3.org/2000/svg"xmlns:xli......
  • 封装分页组件
    效果图   主要框架:vue2+element一:pagination组件代码<template><!--原理:分页中有三个地方需要使用插槽(首页,末页,确定),一个分页模块中只能使用一个插槽,所以......
  • 同步方法里调用异步方法会卡死
    C#同步方法中调用异步方法 一、结果:关于ThreadPool中的线程调用算法,其实很简单,每个线程都有一个自己的工作队列localqueue,此外线程池中还有一个globalqueue全局工......
  • vue3源码学习11-编译two-AST内部转换
    在编译one中,template经过解析最终返回了一个AST节点对象,它是对模板的完整描述,但是还是不能用于生成代码,因为语义化还不够,没有包含编译优化相关的属性,vue内部还进行了进一步......
  • 【Vue项目实践】套用github 上的项目运行 electron + vite + vue3
    最终版gitclonehttps://gitee.com/mywink/vite-electron.gityarnyarnbuildyarndev从github上下载这个项目,运行,就得到了electron桌面版的项目,采用vue3来......