v-menu 的 Vuetify 问题

Posted

技术标签:

【中文标题】v-menu 的 Vuetify 问题【英文标题】:Vuetify issue with v-menu 【发布时间】:2019-01-06 21:01:41 【问题描述】:

Vuetify 1.1.8 / Vue 2.5.16

我不明白为什么会出现两种不同的行为:

1- 在 Codepen.io 中测试

html

    <div id="app">
      <v-app id="inspire">
        <div class="text-xs-center">
          <v-menu offset-y>
            <v-btn
              slot="activator"
              color="primary"
              dark
            >
              <span v-if="this.locale === 'en'">English</span>
              <span v-if="this.locale === 'fr'">Français</span>
              <span v-if="this.locale === 'br'">Português</span>
            </v-btn>
            <v-list>
              <v-list-tile
                v-for="(locale, index) in locales"
                :key="index"
                @click="switchLocale(index)"
              >
                <v-list-tile-title> locale.title </v-list-tile-title>
              </v-list-tile>
            </v-list>
          </v-menu>
        </div>
      </v-app>
    </div>

js

    new Vue(
      el: '#app',
      data: () => (
        locale: 'en',
        locales: [
           locale: 'en', title: 'English', icon: '@/assets/images/flag_gb_24.png' ,
           locale: 'fr', title: 'Français', icon: '@/assets/images/flag_fr_24.png' ,
           locale: 'br', title: 'Português', icon: '@/assets/images/flag_br_24.png' 
        ]
      ),
       methods: 
        switchLocale: function (index) 
          console.log('switch locale: ', this.locales[index].title)
          this.locale = this.locales[index].locale
        
      
    )

运行良好...

但是一旦我将它插入到我的应用程序中的 Vue.js 组件中,我就会收到一个错误:

控制台

    vuetify.js?ce5b:19387 [Vuetify] Unable to locate target [data-app]

    found in

    ---> <VMenu>
           <VToolbar>
             <Toolbar>
               <App> at src/App.vue
                 <Root>
    consoleWarn @ vuetify.js?ce5b:19387
    initDetach @ vuetify.js?ce5b:16782
    mounted @ vuetify.js?ce5b:16742
    callHook @ vue.runtime.esm.js?2b0e:2917
    insert @ vue.runtime.esm.js?2b0e:4154
    invokeInsertHook @ vue.runtime.esm.js?2b0e:5956
    patch @ vue.runtime.esm.js?2b0e:6175
    Vue._update @ vue.runtime.esm.js?2b0e:2666
    updateComponent @ vue.runtime.esm.js?2b0e:2784
    get @ vue.runtime.esm.js?2b0e:3138
    run @ vue.runtime.esm.js?2b0e:3215
    flushSchedulerQueue @ vue.runtime.esm.js?2b0e:2977
    (anonymous) @ vue.runtime.esm.js?2b0e:1833
    flushCallbacks @ vue.runtime.esm.js?2b0e:1754
    Promise.then (async)
    microTimerFunc @ vue.runtime.esm.js?2b0e:1802
    nextTick @ vue.runtime.esm.js?2b0e:1846
    queueWatcher @ vue.runtime.esm.js?2b0e:3064
    update @ vue.runtime.esm.js?2b0e:3205
    Vue.$forceUpdate @ vue.runtime.esm.js?2b0e:2687
    (anonymous) @ index.js?6435:233
    (anonymous) @ index.js?6435:231
    (anonymous) @ index.js?6435:116
    (anonymous) @ Toolbar.vue?be73:29
    ./src/components/Shared/Toolbar.vue @ app.js:2759
    __webpack_require__ @ app.js:768
    hotApply @ app.js:687
    (anonymous) @ app.js:344
    Promise.then (async)
    hotUpdateDownloaded @ app.js:343
    hotAddUpdateChunk @ app.js:319
    webpackHotUpdateCallback @ app.js:37
    (anonymous) @ app.a888e56db407050b2768.hot-update.js:1
    Toolbar.vue?9799:67 TOOLBAR mounted locale:  en

Toolbar.vue

       <template>
          <v-toolbar  fixed>
            <v-toolbar-title>
              <img src="@/assets/images/app_logo.png" >
              <v-menu offset-y>
                <v-btn
                  slot="activator"
                  color="primary"
                  dark
                >
                  <span v-if="this.locale === 'en'">English</span>
                  <span v-if="this.locale === 'fr'">Français</span>
                  <span v-if="this.locale === 'br'">Português</span>
                </v-btn>
                <v-list>
                  <v-list-tile
                    v-for="(locale, index) in locales"
                    :key="index"
                    @click="switchLocale(index)"
                  >
                    <v-list-tile-title> locale.title </v-list-tile-title>
                  </v-list-tile>
                </v-list>
              </v-menu>
            </v-toolbar-title>
            <v-spacer></v-spacer>
            <v-toolbar-items>
              ....
            </v-toolbar-items>
       </v-toolbar>
    </template>

    <script>
    export default 
      name: 'Toolbar',
      props: ['appName'],
      data () 
        return 
          menuItems: 
            home:  icon: 'home', title: 'Home', link: '/' ,
            about:  icon: 'info', title: 'About', link: '/about' 
          ,
          locale: 'en',
          locales: [
             locale: 'en', title: 'English', icon: '@/assets/images/flag_gb_24.png' ,
             locale: 'fr', title: 'Français', icon: '@/assets/images/flag_fr_24.png' ,
             locale: 'br', title: 'Português', icon: '@/assets/images/flag_br_24.png' 
          ]
        
      ,
      methods: 
        switchLocale: function (index) 
          console.log('switch locale: ', this.locales[index].title)
          this.locale = this.locales[index].locale
        
      ,
      mounted () 
        console.log('TOOLBAR mounted locale: ', this.locale)
      
    
    </script>

【问题讨论】:

【参考方案1】:

我们可以手动将data-app 属性添加到我们的根组件,而无需使用&lt;v-app&gt;&lt;/v-app&gt; 包装整个组件。它将如下所示:

<template>
    <div id="app" data-app>
        ....
    </div>
</template>

【讨论】:

【参考方案2】:
 <v-app> <-- you missing <v-app> wrapping because is rule .... 
      <router-view/>
 </v-app>

贤基

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值【参考方案3】:

据我了解,在 vuetify 中,您需要将应用程序包装在 &lt;v-app&gt;&lt;/v-app&gt; 中。这发生在App.vue 或您在main.js 中设置为根组件的任何内容中。 v-app 组件设置了这个data-app 属性。

文档是这样说的:

Vuetify 需要使用 v-app 组件。它应该包装您的整个应用程序,并且是包括主题在内的许多框架功能的中心点。确保您遵循应用程序页面中记录的正确标记。

来源:FAQ: My application does not look correct,检索于 2019 年 10 月 2 日

【讨论】:

是的!非常感谢...忘记了...我正在根据自己的项目设置一个演示项目,所以我从头开始重置所有代码(复制/粘贴代码片段..忘记初始化 v-app .... 有时这还不够(不知道为什么),即使在正文下方添加: 我必须添加“data-app " 归属于“v-app”或 v-app 中的某些 div。真奇怪。我正在使用 webpack(不是 vue-cli) - 也许它是相关的。因为使用 vue-cli (vue create ...vue add vuetify) 时它按预期工作(没有“data-app”) @Roman86 确保您的带有 webpack 配置的项目确实包含最新版本的 vuetify,并且您没有使用从原始组件中剥离 data-app 的 webpack 插件的奇怪组合。还要确保 v-app 由 vuetify 注册,而不是您可能包含的其他库,甚至不是您自己制作的组件。 嗨@Samurai8!感谢您的回复。我使用“vuetify”:“^2.0.0”,“vuetify-loader”:“^1.2.2”,除 vuetify 外,在代码中的任何地方都找不到“data-app” 嗯,这看起来很新。如果没有重现它的方法,我认为我无法提供太多帮助。我建议创建一个 minimal reproducible example 并提出一个专门的问题,如果创建 mcve 还没有让您清楚实际发生了什么。【参考方案4】:

解决了

需要在父包装组件中添加data-app属性

<template>
   <v-toolbar  fixed>
      <v-toolbar-title data-app>

【讨论】:

为什么需要这样做?

以上是关于v-menu 的 Vuetify 问题的主要内容,如果未能解决你的问题,请参考以下文章

Vuetify <v-menu> 中的自动对焦和键盘导航

如何将 Vuetify v-menu 附加到可滚动列表中的父元素?

Vuetify - 将v-menu添加到v-card更改v-card宽度

Vue 3 和 Vuetify 3 Alpha:ValidationError:进度插件无效选项

Vuetify 实现搜索框

Vuetify 导航栏中的中心徽标