内容仅在重新加载后显示

Posted

技术标签:

【中文标题】内容仅在重新加载后显示【英文标题】:Content Will Only Display After Reload 【发布时间】:2022-01-08 23:02:39 【问题描述】:

我正在尝试显示基于 jsCalendar 库的简单日历。当我导航到页面时,日历不会出现;但是,当我重新加载页面[⌘-R]或直接输入页面URL时,内容正常显示。我在 Safari 和 FireFox 中测试过,行为是一样的。

预期结果:

通过 Vue Router 或直接导航到达页面时显示内容。

日历.vue

<template>
    <div class="auto-jsCalendar black-theme"
         data-navigator-position="right"
         data-month-format="month YYYY"
         data-day-format="DDD">
    </div>
</template>

<script>
import 'simple-jscalendar'

  export default 
    emits: ['page-data'],
    mounted() 
      this.$emit('page-data', title: 'calendar', content: '',)
    ,
  
</script>

<style>
  @Import '~simple-jscalendar/source/jsCalendar.css';
  @Import '~simple-jscalendar/themes/jsCalendar.darkseries.css';
</style>

导航到 Calendar.vue

导航到页面时,div 如下所示:

<div class="auto-jsCalendar black-theme" data-navigator-position="right" data-month-format="month YYYY" data-day-format="DDD"></div>

重新加载或直接导航

在重新加载页面或直接在浏览器中输入 URL 时,div 如下所示:

<div class="auto-jsCalendar black-theme" data-navigator-position="right" data-month-format="month YYYY" data-day-format="DDD" jscalendar-loaded="true"></div>

(导航到页面时没有建立动态属性jscalendar-loaded(显示日历对象时添加到div中)。)

环境:

Dave@[SNIP] my_spa % npm list
my_spa@0.1.33 /.../my_spa
├── @vue/cli-plugin-babel@4.5.15
├── @vue/cli-plugin-router@4.5.15
├── @vue/cli-plugin-vuex@4.5.15
├── @vue/cli-service@4.5.15
├── @vue/compiler-sfc@3.2.20
├── babel-eslint@10.1.0
├── chart.js@3.6.0
├── chartjs-plugin-annotation@1.1.0
├── chartjs-plugin-datalabels@2.0.0
├── core-js@3.19.0
├── eslint-plugin-vue@7.20.0
├── simple-jscalendar@1.4.4
├── vue-router@4.0.11
├── vue@3.2.20
├── vue3-smooth-dnd@0.0.2
├── vuex-persist@3.1.3
└── vuex@4.0.2

编辑:在咨询 jsCalendar 的作者时,我了解到脚本作用于页面加载事件,这解释了为什么导航到视图时内容不更新。外部脚本有一个autoFind() 函数,可以从mounted() 调用它应该更新内容;但是,我一直无法找到调用该函数的正确方法。

import jsCalendar from 'simple-jscalendar'

mounted() 
  jsCalendar.autoFind()
  this.$emit('page-data', title: 'calendar', content: '',)
,

结果:

Unhandled Promise Rejection: TypeError: simple_jscalendar__WEBPACK_IMPORTED_MODULE_0___default.a.autoFind is not a function.

【问题讨论】:

可能是这个库有一个准备就绪的处理程序,可以在页面加载时对其进行初始化?然后我会尝试在挂载的钩子中调用这个init方法。 虽然最有可能编写一个包装器来支持这个库(或分叉它),但这超出了我目前的技能范围。相反,我能够找到另一个非常棒的 Vue 3 兼容库 v-calendar 来满足我的需求。 【参考方案1】:

我查看了链接中的文档,这就是我要做的: 从 div 中删除 auto-jsCalendar,因为这是在加载页面时使其工作的钩子,但在导航和添加 ref 时不会工作。 然后在您挂载的钩子中调用jsCalendar.new,如此处所述: https://gramthanos.github.io/jsCalendar/docs.htmljavascript 创建日历)

<template>
    <div class="black-theme"
         data-navigator-position="right"
         data-month-format="month YYYY"
         data-day-format="DDD"
         ref="calendar">
    </div>
</template>

<script>
import 'simple-jscalendar'

  export default 
    emits: ['page-data'],
    mounted() 
      jsCalendar.new(this.$refs.calendar)
      this.$emit('page-data', title: 'calendar', content: '',)
    ,
  
</script>

<style>
  @Import '~simple-jscalendar/source/jsCalendar.css';
  @Import '~simple-jscalendar/themes/jsCalendar.darkseries.css';
</style>

虽然从长远来看,我建议寻找一个为 Vue 构建的库。如果第三方库操作同样来自 Vue 的 DOM,这总是有点棘手。

【讨论】:

感谢您抽出宝贵时间。不幸的是,通过这种结构,我得到了Can't find variable: jsCalendar 错误。所以我将导入更改为import jsCalendar from 'simple-jscalendar' and I get a new is not a function` 错误。我将继续修补您引用的 API 调用,看看我是否能找到一些东西。你可能是对的,这个库(虽然非常棒)不适合 Vue。干杯。 那应该是new is not a function 错误。 @DaveL17 还有其他例子,也许new jsCalendar(this.$refs.calendar); 有效 是的,也试过了。导致object is not a constructor 错误。

以上是关于内容仅在重新加载后显示的主要内容,如果未能解决你的问题,请参考以下文章

背景图像仅在重新加载页面后显示

仅在热重新加载后才加载我的值

显示 React 中写入字符数的 Textarea 组件仅在重新加载后更新值

成功的PHP登录仅在重新加载页面后出现

SDWebImage 下载后不显示(仅在重新打开 VController 后)

createImageBitmap 仅在页面重新加载后执行