首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vue.js不更新挂载()钩子

vue.js不更新挂载()钩子
EN

Stack Overflow用户
提问于 2018-05-03 15:35:31
回答 1查看 1.5K关注 0票数 0

编辑:解决,见答案。

所以我对vue.js和类星体很陌生,所以这可能是关于vue生命周期挂钩和vue反应性的一个新手错误。

我想根据浏览器的大小调整元素的大小。此元素的高度是使用其他元素的高度计算的。我使用$refs获取另一个元素的高度,并捕获类星体组件启动的onResize()事件。

这个事件是在页面加载时启动一次的,我的元素的大小都是0,因为我猜它们还没有在DOM中呈现。我有一个刷新计算高度的方法,在捕获"onResize“事件时,以及在”装入()“vue.js钩子时调用它。

我的问题是:

  • 第一个onResize()调用该方法,但所有元素的高度都为0px。
  • 装入()再次调用该方法,在这里计算所有元素的高度。结果很好,但它没有显示在显示器上,请参见屏幕快照#1 :调整记录在控制台中的事件和大小,请注意,大小计算了两次,一次在onResize()上,一次在挂载()上。挂载()上的那个有很好的值,但它没有显示在DOM中。

  • 当我调整窗口的大小后,一切都好了,我不再有任何问题了。(屏幕截图#2 (窗口模式)和#3 (再次显示全屏))

我的问题是:即使正确计算,挂载()钩子被调用时,为什么DOM中的高度没有更新?(所有内容都在同一个.vue文件中)

我的代码:我的问题是有"tableRow“引用的div的高度

代码语言:javascript
复制
<template>
  <q-page>
    <div class="row" :style="'height: '+pageSize.height*0.95+'px;'">
      <div class="col-6 q-pa-lg">

        <div class="row" ref="actionsRow">
          <div class="col-6 q-mb-sm">
            <q-search hide-underline v-model="filter" />
          </div>
          <div class="col-6">

          </div>
        </div>

        <div class="row" ref="tableHeaderRow">
          <q-table class="col-12" :selection="selectionMode" :selected.sync="selectedRows" :data="templateTableData" :columns="templateColumns"
            row-key="slug" :pagination.sync="pagination" dense hide-bottom>
            <q-tr slot="body" slot-scope="props" :props="props">
            </q-tr>
          </q-table>
        </div>

        <div class="row" ref="tableRow" :style="'height: '+tableHeight+'px;'">
          <q-scroll-area style="height: 100%" class="col-12 q-mt-sm shadow-3">
            <q-table :selection="selectionMode" :selected.sync="selectedRows" :data="templateTableData" :columns="templateColumns" row-key="slug"
              :filter="filter" :pagination.sync="pagination" dense hide-bottom hide-header>
              <q-tr slot="body" slot-scope="props" :props="props" @click.native="onRowClick(props.row)" class="cursor-pointer">
                <q-td auto-width>
                  <q-checkbox color="primary" v-model="props.selected" />
                </q-td>
                <q-td v-for="col in props.cols" :key="col.name" :props="props">
                  {{ col.value }}
                </q-td>
              </q-tr>
            </q-table>
          </q-scroll-area>
        </div>

      </div>
      <router-view class="col-6 q-pa-lg">
      </router-view>
    </div>
    <q-window-resize-observable @resize="onResize" />
  </q-page>
</template>

剧本:

代码语言:javascript
复制
var data = []
for (var i = 1; i <= 100; i++) {
  data.push({
    id: i,
    name: 'Template ' + i,
    slug: 'template' + i,
    active: true
  })
}

import { mapActions, mapGetters } from 'vuex'

export default {
  data: () => ({
    pageSize: {
      height: 0,
      width: 0
    },
    tableHeight: 0,
    templateColumns: [
      {
        name: 'templateName',
        required: true,
        label: 'Name',
        align: 'left',
        field: 'name',
        sortable: true
      },
      {
        name: 'templateSlug',
        label: 'Slug',
        align: 'left',
        field: 'slug',
        sortable: true
      },
      {
        name: 'templateActive',
        label: 'Active',
        align: 'left',
        field: 'active',
        sortable: true,
        sort: (a, b) => {
          if ((a && b) || (!a && !b)) {
            return 0
          } else if (a) {
            return 1
          } else {
            return -1
          }
        }
      }
    ],
    selectionMode: 'multiple',
    selectedRows: [],
    pagination: {
      sortBy: null, // String, column "name" property value
      descending: false,
      page: 1,
      rowsPerPage: 0 // current rows per page being displayed
    },
    templateTableData: data,
    filter: ''
  }),
  computed: {
    ...mapGetters('appUtils', [
      'getPageTitle',
      'allConst'
    ])
  },
  methods: {
    ...mapActions('appUtils', [
      'setPageTitle',
      'deletePageTitle'
    ]),
    onResize (size) {
      this.pageSize.height = size.height - this.getPageTitle.height
      this.resizeTable()
      console.log('ON RESIZE EVENT:')
      console.log('tableHeaderRow:'+
          this.$refs.tableHeaderRow.clientHeight)
      console.log('actionsRow:' + this.$refs.actionsRow.clientHeight)
      console.log('table:' + this.tableHeight)
    },
    onRowClick (row) {
      this.$router.push('/templates/' + row.slug)
    },
    resizeTable () {
      this.tableHeight = this.pageSize.height - this.$refs.actionsRow.clientHeight -
          this.$refs.tableHeaderRow.clientHeight - this.getPageTitle.height -
          this.allConst.templatePageHeaderMargins
    }
  },
  mounted () {
    console.log('MOUNT TEMPLATES')
    this.setPageTitle({ text: 'Manage templates', height: this.allConst.titleHeight })
    this.resizeTable()
    console.log('tableHeaderRow:' + this.$refs.tableHeaderRow.clientHeight)
    console.log('actionsRow:' + this.$refs.actionsRow.clientHeight)
    console.log('table:' + this.tableHeight)
  },
  destroyed () {
    console.log('DESTROY TEMPLATES')
    this.deletePageTitle()
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 16:11:34

在第一个titleSize事件期间,我的另一个变量( onResize() )是0,就像其他大小一样,在mounted()挂钩期间,我没有考虑到这一点来纠正它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50158913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档