vue.js - 通知 App.vue 正在调用 Service-Worker 事件

标签 vue.js vuejs2 service-worker progressive-web-apps vue-cli-3

我有一个使用 Vue CLI 3 创建的项目,其中包含 Vue 的 PWA 插件。我想显示一个横幅,提示用户单击应用程序内的“刷新”链接,如所述 here在“方法 #3”部分。

但在我的 Vue.js 应用程序中,因为服务 worker 代码是在 main.js 中执行的,而我的 snackbar 横幅是内置在我的 App.vue 组件中的,我不确定如何在服务 worker updated() 事件被调用后触发我的 showRefreshUI() 方法。

main.js(适用部分)

import Vue from 'vue';
import App from './App';
import './registerServiceWorker';

new Vue({
  router,
  render: h => h(App),
}).$mount('#app');

register-service-worker(适用部分)

import { register } from 'register-service-worker';

if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    updated (registration) {
      console.log('New content is available; please refresh.');
      // I'd like to call App.vue's showRefreshUI() method from here.
    },
  });
}

App.vue(适用部分)

<script>
export default {
  name: 'App',
  mounted () {
    // Alternatively, I'd like to call this.showRefreshUI() from here
    // when the service worker's updated() method is called.
  },

  methods: {
    showRefreshUI () {
      // My code to show the refresh UI banner/snackbar goes here.
    },
  },
};
</script>

如果我不能从 main.js 调用 showRefreshUI() 方法,我怎么可能从 updated() 传递一些东西事件到 App.vuemounted() 生命周期钩子(Hook)来完成同样的基本事情?

最佳答案

对我来说最终可行的解决方案是保持 main.js 不变,而是:

register-service-worker(适用部分)

import { register } from 'register-service-worker';

const UpdatedEvent = new CustomEvent('swUpdated', { detail: null });

if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    updated (registration) {
      console.log('New content is available; please refresh.');
      UpdatedEvent.detail = registration;
      document.dispatchEvent(UpdatedEvent);
    },
  });
}

App.vue(适用部分)

<script>
export default {
  name: 'App',
  data () {
    return {
      registration: null,
    };
  },
  mounted () {
    document.addEventListener('swUpdated', this.showRefreshUI);
  },
  beforeDestroy () {
    document.removeEventListener('swUpdated', this.showRefreshUI);
  },
  methods: {
    showRefreshUI (e) {
      this.registration = e.detail;
      // My code to show the refresh UI banner/snackbar goes here.
    },
  },
};
</script>

关于vue.js - 通知 App.vue 正在调用 Service-Worker 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53680243/

相关文章:

javascript - 未捕获的 TypeError : this. 保存不是函数(VueJs)

javascript - 在 Vue.js 中获取计算属性的值并在数据属性中使用它

Angular.io 拦截器与服务 worker

javascript - 如何检查给定 URL 中是否存在 service-worker?

vue.js - 如何解决 'vue-cli-service' 不被识别为内部或外部命令?

javascript - 后端API应用程序未运行时如何处理Vue JS应用程序?

javascript - Vue.js - 是否可以使用 Javascript 动态导入从另一台服务器加载组件?

javascript - Axios 以错误的顺序进行 DELETE 和 GET

javascript - 了解 Service Worker 范围

javascript - 在javascript中过滤具有当前日期的API数据