zoukankan      html  css  js  c++  java
  • 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
            }
          },
    
  • 相关阅读:
    TC SRM 591 (Div2. Practice only)
    SDL2 简单实现图片缩放移动查看
    Linux下socket编程 address already in use 问题
    POJ 2155 二维树状数组
    OJ开发笔记(1)
    开通博客啦~
    [转]STL transform算法中使用toupper函数
    Monkey and Banana HDU 1069
    Ignatius and the Princess IV HDU 1029
    Dungeon Master POJ 2251
  • 原文地址:https://www.cnblogs.com/yloved/p/13327989.html
Copyright © 2011-2022 走看看