问题
Vuetify 1.1.8 / Vue 2.5.16
I don't understand why I get 2 different behaviors :
1- testing in 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
}
}
})
is running fine...
BUT once I insert it into a Vue.js component in my app, I get an error :
console
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 height="80px" fixed>
<v-toolbar-title>
<img src="@/assets/images/app_logo.png" alt="">
<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:
As far as I understand, in vuetify you need to wrap your application in <v-app></v-app>
. This happens in App.vue
or whatever you have set in your main.js
as root component. The v-app components sets this data-app
attribute.
The documentation says this about it:
Vuetify requires the use of the v-app component. It should wrap your entire application and is the center point for much of the framework functionality including themes. Ensure that you are following the proper markup documented in the Application page.
Source: FAQ: My application does not look correct, retrieved on 2 October 2019
回答2:
SOLVED
Need to add data-app attribute in the parent wrapper component
<template>
<v-toolbar height="80px" fixed>
<v-toolbar-title data-app>
来源:https://stackoverflow.com/questions/51596881/vuetify-issue-with-v-menu