• vue中一个组件使用多个相同子组件自适应窗口变化问题


    vue中一个组件使用多个相同子组件自适应窗口变化问题

    问题背景

    1. 一个组件中用了两次自定义的table组件
    2. table组件中使用window.onresize监听了浏览器窗口的变化,并做了自适应处理

    产生的问题

    由于window是个全局变量,所以渲染第二个table组件时,会覆盖第一个table组件的监听事件,所以只有第二个table会自适应缩放

    解决

    在父组件中获取两个table子组件的dom,然activated周期函数中手动调用子组件的自适应函数 changeTableHeight,由于我使用了keep-alive,所以重新进入之前进过的页面时,不会重新调用钩子函数,activated例外,所以将window.onresize放在activated中,每次进入页面时都会刷新这个监听事件

        activated() {
          //监听窗口的变化放在 actived中,每次进入页面时都会重新刷新监听函数
          //解决了在多个组件中同时使用window.onresize时,监听失效问题
          //失效原因是进入当前页面时,不执行其它钩子函数(mounted,created等),未刷新window.onresize事件
          this.$nextTick(() => {
            window.onresize = () => {
              return (() => {
                console.log("active")
                this.$refs.left.changeTableHeight()
                this.$refs.right.changeTableHeight()
              })()
            }
          })
    
        },
    

    子组件中的自适应处理

    如果父组件只使用一次有window.onresize的子组件,在父组件中就不需要重新监听窗口大小的变化

    1. 子组件activated钩子函数
        activated() {
          //进入页面时,计算表格的高度
          //由于在created钩子函数中,页面元素还未渲染
          //使用 $nextTick ,使元素渲染成功后执行函数
          this.$nextTick(() => {
            this.changeTableHeight()
            //窗口发生变化时触发,重新计算页面中表格的高度
            window.onresize = () => {
              return (() => {
                this.changeTableHeight()
              })()
            }
          })
        },
    
    1. 自适应处理函数
    methods: {
          //随着浏览器窗口的高度,改变表格的高度
          changeTableHeight() {
            if (this.isAutoHeight) {
              let height = window.innerHeight
              // 窗口的高度 - 表格顶端距离界面顶端的高度 - 表格底部想要距离界面底部的高度(这个高度可以自己调试)
              this.tableHeight = height - this.$refs.hTable.$el.getBoundingClientRect().top - this.$refs.hPage.$el.clientHeight - 45
            }
          },
    
  • 相关阅读:
    onlyoffice 宋体显示问题排查
    【记录】shell脚本简写
    java 读取jar包内文件方法
    clickhouse升级
    grafana安装升级部署
    grafana新增插件
    ogg复制进程集成模式与经典模式之间切换
    ogg主库目录迁移
    goldengate从库目录迁移
    goldengate如何判断数据是否完成同步
  • 原文地址:https://www.cnblogs.com/yloved/p/13327989.html
Copyright © 2020-2023  润新知