javascript - Nuxt mixin - 属性或方法未在实例上定义但在渲染期间被引用

标签 javascript vue.js nuxt.js mixins

我正在创建一个 Nuxt 应用程序,其中一个特定的菜单应该在移动设备上隐藏。所以我创建了一个 mixin 插件,它具有 isSmallScreen 属性,可以是 false 或 true。

mixins.client.js

import Vue from 'vue'
import styles from '@/assets/styles/base/globals/_responsive.scss'

const debug = true

let breakpoint = parseInt(styles.breakpoint, 10)

Vue.mixin({
  data: function() {
    return {
      isSmallScreen: null
    }
 },
 created() {
    this.isSmallScreen = (window.innerWidth <= breakpoint)
  }
})

我已经在 nuxt.config.js 中注册了 mixins 插件

plugins: [
  '~/plugins/base/global/mixins.client.js',
]

现在我希望 isSmallScreen 全局可用。当我在 layouts/default.vue 的 mounted 钩子(Hook)中 console.log this.isSmallScreen 时,它为小屏幕返回 true,而 false 适用于更大的屏幕。这似乎工作正常。

问题

我的 default.vue 布局模板看起来像

<template>
<div>

  <client-only>
    <div class="nav-container">
      <f-nav-admin />
      <f-nav-top v-if="!isSmallScreen"/>
    </div>
  </client-only>

  <!-- page content -->
  <div class="page-content-container">
    <nuxt />
  </div>

</div>
</template>

我希望 f-nav-top 组件确实出现在大屏幕上,并隐藏在小屏幕上。这似乎也有效。

但是..

即使功能正常运行,我仍然会收到如下所示的警告。

属性或方法“isSmallScreen”未在实例上定义,但在渲染期间被引用。通过初始化该属性,确保该属性在数据选项中或对于基于类的组件是 react 性的。

我一直在寻找解决方案,但找不到解决方案。有人看到我在这里做错了什么吗?

提前致谢

最佳答案

我发现了问题。 <nuxt/>里面组件是对 isSmallScreen 的引用以及。在页面重新加载时,数据中不存在该属性。那是因为我将我的 mixins 文件命名为 mixins.client.js

documentation有一部分关于Name conventional plugin 这意味着file.client.js只会在客户端运行,并且file.server.js只有SSR。这就是为什么我的 mixin 插件中的数据不可用而导致出现警告的原因。

将我的 mixins 文件名更改为 mixins.js为我做了修复。

关于javascript - Nuxt mixin - 属性或方法未在实例上定义但在渲染期间被引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60971116/

相关文章:

javascript - 将包含 HTML 实体的 JSON 序列化字符串转换为对象

javascript - 我如何创建一个带有滚动的 html 表格

javascript - 在 v-for 中选择选择框的第一个选项

vue.js - Nuxt 不会在路由更改时更新

node.js - 如何使用forever来运行Nuxt.js应用程序?

javascript - 显示旧数据的 Reactjs 组件

javascript - jQuery 添加目标 ="_blank"用于传出链接

javascript - Vuejs 和 Laravel : How to use http get to pass an array to Laravel controller

javascript - 如何将 "child.vue"加载到正确的 "parent.vue"位置

Docker 原因 : connect ECONNREFUSED 0. 0.0.0:80