Reputation:
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>
Upvotes: 16
Views: 35519
Reputation: 2718
We can add data-app
attribute manually to our root component without wrapping the entire component with <v-app></v-app>
. It will look like the following:
<template>
<div id="app" data-app>
....
</div>
</template>
Upvotes: 11
Reputation: 21
<v-app> <-- you missing <v-app> wrapping because is rule ....
<router-view/>
</v-app>
hyunki
Upvotes: 2
Reputation: 20745
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
Upvotes: 68
Reputation:
SOLVED
Need to add data-app attribute in the parent wrapper component
<template>
<v-toolbar height="80px" fixed>
<v-toolbar-title data-app>
Upvotes: 11