我的编程空间,编程开发者的网络收藏夹
学习永远不晚

DataV全屏容器组件源码分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

DataV全屏容器组件源码分析

这篇文章主要介绍“DataV全屏容器组件源码分析”,在日常操作中,相信很多人在DataV全屏容器组件源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”DataV全屏容器组件源码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    引言

    数据可视化页面一般在浏览器中进行全屏展示,全屏容器将根据屏幕比例及当前浏览器窗口大小,自动进行缩放处理。浏览器全屏后,全屏容器将充满屏幕。

    源码阅读(vue2版本)

    它的源码位置

    DataV全屏容器组件源码分析

    看下它的DOM结构,很简单

    <div id="dv-full-screen-container" :ref="ref">    <template v-if="ready">      <slot></slot>    </template></div>

    源码分析

    接下来重点看下它的JS实现,它的代码中混入了autoResize.js,所以我们需要两个文件一起看,不然会对突然出现的变量很奇怪。(如果觉得分开不便于阅读,其实我们可以把它合在一起来阅读,是一样的)

    梳理下它的执行逻辑:

    第1步、mounted(组件挂载时,这一时期可对dom进行操作)

    mounted () {  const { autoResizeMixinInit } = this  autoResizeMixinInit()},

    第2步、autoResizeMixinInit函数

    methods: {    async autoResizeMixinInit () {      const { initWH, getDebounceInitWHFun, bindDomResizeCallback, afterAutoResizeMixinInit } = this      await initWH(false)      getDebounceInitWHFun()      bindDomResizeCallback()      if (typeof afterAutoResizeMixinInit === 'function') afterAutoResizeMixinInit()    },}

    这其中调用了几个函数,我们来看看这些函数的作用。

    1、initWH函数

        // 初始化宽高    initWH (resize = true) {      const { $nextTick, $refs, ref, onResize } = this      return new Promise(resolve => {        $nextTick(_ => {          const dom = this.dom = $refs[ref]          this.width = dom ? dom.clientWidth : 0          this.height = dom ? dom.clientHeight : 0          if (!dom) {             console.warn('DataV: Failed to get dom node, component rendering may be abnormal!')          } else if (!this.width || !this.height) {            console.warn('DataV: Component width or height is 0px, rendering abnormality may occur!')          }          if (typeof onResize === 'function' && resize) onResize()          resolve()        })      })    },

    这个函数的作用很简单,就是在DOM渲染成功后,获取这个组件dom的宽高,返回一个Promise异步函数,作用就是:保证这个dom已经渲染好了,再去执行其他函数。

    1.1、onResize

        onResize () {      const { setAppScale } = this      setAppScale()    }

    resize为true,即窗口大小变化、dom的style改变时要重新设置dom的缩放比例。

    2、getDebounceInitWHFun

    getDebounceInitWHFun () {      const { initWH } = this      this.debounceInitWHFun = debounce(100, initWH)    },

    获取一个经过防抖的initWH函数。即debounceInitWHFun。

    3、bindDomResizeCallback

        // 监听dom元素变化    bindDomResizeCallback () {      const { dom, debounceInitWHFun } = this      this.domObserver = observerDomResize(dom, debounceInitWHFun)      window.addEventListener('resize', debounceInitWHFun)    },

    很重要的一步,其中使用了observerDomResize来对这个组件dom进行监听。

    需要监听的DOM变化:

    • 窗口大小改变时触发的事件

    • dom的样式改变时触发

    第一个直接使用window监听resize事件即可。

    第二个对dom元素的监听,我们就需要使用MutationObserver来做了。

    MutationObserver用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动都会触发MutationObserver事件。

    封装一个observerDomResize函数来对dom的style属性变化进行监听

    export function observerDomResize (dom, callback) {  const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver  const observer = new MutationObserver(callback)  observer.observe(dom, { attributes: true, attributeFilter: ['style'], attributeOldValue: true })  return observer}
    • attributes:属性的变动

    • attributeFilter:表示需要观察的特定属性

    • attributeOldValue:布尔值,表示观察attributes变动时,是否需要记录变动前的属性值。

    4、afterAutoResizeMixinInit

        afterAutoResizeMixinInit () {      const { initConfig, setAppScale } = this      initConfig()      setAppScale()      this.ready = true    },

    组件dom节点渲染出来后,设置ready为true,再渲染插槽中的DOM元素。

    1、initConfig

        initConfig () {      const { dom } = this      // 当前屏幕分辨率      const { width, height } = screen      this.allWidth = width      dom.style.width = `${width}px`      dom.style.height = `${height}px`    },

    作用:

    • 获取当前设备屏幕的分辨率

    • 将这个分辨率宽高设置为组件DOM的宽高

    2、setAppScale

        setAppScale () {      const { allWidth, dom } = this      const currentWidth = document.body.clientWidth      dom.style.transform = `scale(${currentWidth / allWidth})`    },

    它的作用是改变当前DOM的缩放比率。

    缩放比率 = 当前窗口的可视宽度 / 当前设备的屏幕分辨率(宽度)

    第3步、beforeDestroy(组件卸载时)

      beforeDestroy () {    const { unbindDomResizeCallback } = this    unbindDomResizeCallback()  }

    我们之前对于dom的style属性和window的resize都做了监听,所以当我们组件卸载时这些监听事件也需要移除,如果不移除,那么到其他页面,做这些操作,监听事件仍然存在,但其实我们已经不需要再对他监听了,反而会造成性能浪费。

    1、unbindDomResizeCallback

        unbindDomResizeCallback () {      let { domObserver, debounceInitWHFun } = this      if (!domObserver) return      domObserver.disconnect()      domObserver.takeRecords()      domObserver = null      window.removeEventListener('resize', debounceInitWHFun)    }

    disconnect方法用来停止观察。调用该方法后,DOM 再发生变动,也不会触发观察器。

    takeRecords用来清除变动记录,即不再处理未处理的变动。该方法返回变动记录的数组。

    到此,关于“DataV全屏容器组件源码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    DataV全屏容器组件源码分析

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    DataV全屏容器组件源码分析

    这篇文章主要介绍“DataV全屏容器组件源码分析”,在日常操作中,相信很多人在DataV全屏容器组件源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”DataV全屏容器组件源码分析”的疑惑有所帮助!接下来
    2023-07-05

    DataV 全屏容器组件源码解析

    这篇文章主要为大家介绍了DataV 全屏容器组件源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-14

    vue3 hook重构DataV的全屏容器组件详解

    这篇文章主要为大家介绍了vue3 hook重构DataV的全屏容器组件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-14

    vue3 hook如何重构DataV的全屏容器组件

    今天小编给大家分享一下vue3 hook如何重构DataV的全屏容器组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现创
    2023-07-06

    vue3 hook怎么重构DataV的全屏容器组件

    实现创建组件fullScreenContainer.vueimport{useAutoResize}from&#39;@/hooks/useAutoResize&#39;const{autoBindRef}=useAutoResize()自定义一个hook,导出一个autoBindRef绑定ref自定义hook文件useAutoResize.tsimport{ref}from&#39;vue&#39;;exportfunctionuseAutoResize(){l
    2023-05-16

    iOS组件化源码分析

    这篇“iOS组件化源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“iOS组件化源码分析”文章吧。一、iOS 组件化常用
    2023-07-05

    Vue3全局组件通信之provide/inject源码分析

    1、前言顾名思义,爷孙组件是比父子组件通信要更深层次的引用关系(也有称之为“隔代组件”):C组件引入到B组件里,B组件引入到A组件里渲染,此时A是C的爷爷级别(可能还有更多层级关系),如果你用props,只能一级一级传递下去,那就太繁琐了,因此我们需要更直接的通信方式。他们之间的关系如下,Grandson.vue并非直接挂载在Grandfather.vue下面,他们之间还隔着至少一个Son.vue(可能有多个):Grandfather.vue└─Son.vue└─Grandson.vue因为上下
    2023-05-14

    源码分析Django的message组件

    这篇文章主要介绍了源码分析Django的message组件,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-18

    Android Jetpack组件LiveData源码分析

    本篇内容主要讲解“Android Jetpack组件LiveData源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android Jetpack组件LiveData源码分析”吧!基本使用
    2023-07-05

    SpringCloud负载均衡组件Ribbon源码分析

    本文小编为大家详细介绍“SpringCloud负载均衡组件Ribbon源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud负载均衡组件Ribbon源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
    2023-07-02

    Vue组件中的自定义事件源码分析

    这篇文章主要介绍“Vue组件中的自定义事件源码分析”,在日常操作中,相信很多人在Vue组件中的自定义事件源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue组件中的自定义事件源码分析”的疑惑有所帮助!
    2023-06-29

    Dubbo Service Mesh基础架构组件源码分析

    这篇文章主要讲解了“Dubbo Service Mesh基础架构组件源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dubbo Service Mesh基础架构组件源码分析”吧!其他基
    2023-07-05

    如何理解Java 容器中并发容器的源码分析

    这期内容当中小编将会给大家带来有关如何理解Java 容器中并发容器的源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果没有特别说明,以下源码分析基于 JDK 1.8。CopyOnWriteArra
    2023-06-05

    vue3新拟态组件库开发流程之table组件源码分析

    这篇文章主要介绍了vue3新拟态组件库开发流程——table组件源码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-18

    如何理解Java容器中Map的源码分析

    本篇文章为大家展示了如何理解Java容器中Map的源码分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果没有特别说明,以下源码分析基于 JDK 1.8。一、HashMap为了便于理解,以下源码分
    2023-06-05

    如何理解Java容器中ArrayList的源码分析

    这篇文章给大家介绍如何理解Java容器中List的源码分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如果没有特别说明,以下源码分析基于 JDK 1.8。一、ArrayList1. 概览实现了 RandomAcces
    2023-06-05

    Vue3源码分析组件挂载创建虚拟节点

    这篇文章主要为大家介绍了Vue3源码分析组件挂载创建虚拟节点,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-13

    Vue3源码分析组件挂载初始化props与slots

    这篇文章主要为大家介绍了Vue3源码分析组件挂载初始化props与slots实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-13

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录