Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vue.js 如何正确注册一个应用程序范围的窗口侦听器,以访问Nuxt JS中的存储_Vue.js_Nuxt.js - Fatal编程技术网

Vue.js 如何正确注册一个应用程序范围的窗口侦听器,以访问Nuxt JS中的存储

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); }

我一直在想,如何在NuxtJS应用程序中附加一个
窗口大小调整
侦听器,以确定屏幕宽度是指手机屏幕还是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 }
  ]
}

我还没有试过,但我认为这是最好的方法。

我刚刚测试过,效果很好,你可以使用它;)我一开始也尝试过类似的方法,但无法访问存储。不知道为什么,因为你的代码真的很有魅力。我会使用你的图案,非常感谢。我刚刚测试过,效果很好,你可以使用;)我一开始也尝试过类似的方法,但无法访问存储。不知道为什么,因为你的代码真的很有魅力。我将使用您的模式,非常感谢。