Dou*_*ich 3 vue.js service-worker progressive-web-apps vuejs2 vue-cli-3
我有一个使用Vue CLI 3创建的项目,其中包括Vue的PWA插件。我想显示横幅提示用户点击描述一个在应用程序“刷新”链接在这里的“方法3”部分。
但是在我的Vue.js应用程序中,因为service-worker代码是在中执行的main.js,并且快餐栏横幅已内置到App.vue组件中,所以我不确定showRefreshUI()一旦updated()调用service-worker 事件后如何触发我的方法。
main.js (适用部分)
import Vue from 'vue';
import App from './App';
import './registerServiceWorker';
new Vue({
router,
render: h => h(App),
}).$mount('#app');
Run Code Online (Sandbox Code Playgroud)
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.
},
});
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
如果无法从中调用showRefreshUI()方法main.js,如何将updated()事件中App.vue的某些内容传递给的mounted()生命周期挂钩以完成相同的基本操作?
对我来说,最终的工作解决方案是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);
},
});
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)