Vue.js 如何正确注册一个应用程序范围的窗口侦听器,以访问Nuxt JS中的存储
我一直在想,如何在NuxtJS应用程序中附加一个Vue.js 如何正确注册一个应用程序范围的窗口侦听器,以访问Nuxt JS中的存储,vue.js,nuxt.js,Vue.js,Nuxt.js,我一直在想,如何在NuxtJS应用程序中附加一个窗口大小调整侦听器,以确定屏幕宽度是指手机屏幕还是pc屏幕 我使用了几种布局,因此我希望避免在每种布局中定义侦听器。因此,我需要在别处创建。到目前为止我已经试过了 1) 创建一个mixin const mixin { mounted() { ...code to determine mobile devices } } export default { install(Vue) { Vue.mixin(mixin); }
窗口大小调整
侦听器,以确定屏幕宽度是指手机屏幕还是pc屏幕
我使用了几种布局,因此我希望避免在每种布局中定义侦听器。因此,我需要在别处创建。到目前为止我已经试过了
1) 创建一个mixin
const mixin {
mounted() { ...code to determine mobile devices }
}
export default {
install(Vue) {
Vue.mixin(mixin);
},
};
我使用Vue.use(handleResize)
导出并安装了mixin。我在numxt.config.js
中注册了这个插件。然而,这使得mixin在我拥有的每个组件中都被激发(毫不奇怪),而不是总共一次
2) 使用延迟混合
正如所建议的,我使用了他的方法来注册听众
import extend from '@/utils/extend-vue-app';
import isMobile from '@/utils/isMobile';
import throttle from 'lodash.throttle'
function handleResizeUtil(app) {
const mobile = isMobile();
if (mobile !== app.store.state.utils.isMobile) {
app.store.commit('utils/TOGGLE_IS_MOBILE', mobile);
}
}
const handleWindowResize = throttle(function(app) {
handleResizeUtil(app);
}, 250);
export default async function ({ app }) {
extend(app, {
mounted () {
handleWindowResize(app);
window.addEventListener('resize', () => handleWindowResize(app));
},
})
}
到目前为止,这种方法效果良好。但我的问题是,创建应用程序范围的事件侦听器需要大量代码
所以我的问题是,是否有人知道如何只注册一次窗口侦听器并访问vuex存储?非常感谢。我认为您应该能够创建一个客户端专用插件来处理: 插件/resize.js
export default ({ store }, inject) => {
store.dispatch('WINDOW_SIZE_CHANGED')
window.onresize = () => {
store.dispatch('WINDOW_SIZE_CHANGED')
}
}
module.exports = {
plugins: [
{ src: '~/plugins/resize', ssr: false }
]
}
您只需在numxt.config.js
中注册它,并将其标记为ssr:false
即可不触发服务器端的插件:
numxt.config.js
export default ({ store }, inject) => {
store.dispatch('WINDOW_SIZE_CHANGED')
window.onresize = () => {
store.dispatch('WINDOW_SIZE_CHANGED')
}
}
module.exports = {
plugins: [
{ src: '~/plugins/resize', ssr: false }
]
}
我还没有尝试过,但我认为这是最好的方法。我认为您应该能够创建一个客户端专用插件来处理这个问题: 插件/resize.js
export default ({ store }, inject) => {
store.dispatch('WINDOW_SIZE_CHANGED')
window.onresize = () => {
store.dispatch('WINDOW_SIZE_CHANGED')
}
}
module.exports = {
plugins: [
{ src: '~/plugins/resize', ssr: false }
]
}
您只需在numxt.config.js
中注册它,并将其标记为ssr:false
即可不触发服务器端的插件:
numxt.config.js
export default ({ store }, inject) => {
store.dispatch('WINDOW_SIZE_CHANGED')
window.onresize = () => {
store.dispatch('WINDOW_SIZE_CHANGED')
}
}
module.exports = {
plugins: [
{ src: '~/plugins/resize', ssr: false }
]
}
我还没有试过,但我认为这是最好的方法。我刚刚测试过,效果很好,你可以使用它;)我一开始也尝试过类似的方法,但无法访问存储。不知道为什么,因为你的代码真的很有魅力。我会使用你的图案,非常感谢。我刚刚测试过,效果很好,你可以使用;)我一开始也尝试过类似的方法,但无法访问存储。不知道为什么,因为你的代码真的很有魅力。我将使用您的模式,非常感谢。