Vuetify: 2.0.0-alpha.11
Last working version: 1.5.8
Vue: 2.6.6
Browsers: Chrome 73.0.3683.86
OS: Windows 10
Setup a new Vue Project and install Vuetify 2.0.0-alpha.11 with npm.
This must start properly
The server starts well with npm run serve
but when I open the page in a browser, I can see this error in console:
[Vue warn]: Error in getter for watcher "isDark": "TypeError: Cannot read property 'dark' of undefined"
found in
---> <VApp>
<App> at src/App.vue
<Root>
https://github.com/vcastro45/IssueVuetify2
My App.vue
file looks like this:
<template>
<div id="app">
<v-app>
<router-view/>
</v-app>
</div>
</template>
and main.ts
looks like this:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Vuetify from 'vuetify'
import 'vuetify/src/stylus/app.styl'
import 'vuetify/src/styles/main.sass'
import '@mdi/font/css/materialdesignicons.min.css'
Vue.config.productionTip = false
Vue.use(Vuetify, {
icons: {
iconfont: 'mdi'
}
})
new Vue({
router,
store,
render: (h) => h(App),
}).$mount('#app')
This is due to this line:
https://github.com/vuetifyjs/vuetify/blob/2c785cc7c5b7731a0b7ecbc7bca7d7cea4b57bca/packages/vuetify/src/components/VApp/VApp.ts#L37
In fact, $vuetify.theme
is undefined. just like $vuetify.breakpoints
We are not accepting bug reports for alpha builds.
Your particular issue has to do with not properly bootstrapping you app as laid out in alpha.5 patch notes.
Versions and Environment
Vuetify: 2.0.0-alpha.11
Last working version: 1.5.8
Vue: 2.6.6
Browsers: Chrome 73.0.3683.86
OS: Windows 10Steps to reproduce
Setup a new Vue Project and install Vuetify 2.0.0-alpha.11 with npm.
Expected Behavior
This must start properly
Actual Behavior
The server starts well with
npm run serve
but when I open the page in a browser, I can see this error in console:[Vue warn]: Error in getter for watcher "isDark": "TypeError: Cannot read property 'dark' of undefined" found in ---> <VApp> <App> at src/App.vue <Root>
Reproduction Link
https://github.com/vcastro45/IssueVuetify2
Other comments
My
App.vue
file looks like this:<template> <div id="app"> <v-app> <router-view/> </v-app> </div> </template>
and
main.ts
looks like this:import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' import Vuetify from 'vuetify' import 'vuetify/src/stylus/app.styl' import 'vuetify/src/styles/main.sass' import '@mdi/font/css/materialdesignicons.min.css' Vue.config.productionTip = false Vue.use(Vuetify, { icons: { iconfont: 'mdi' } }) new Vue({ router, store, render: (h) => h(App), }).$mount('#app')
PS
This is due to this line:
https://github.com/vuetifyjs/vuetify/blob/2c785cc7c5b7731a0b7ecbc7bca7d7cea4b57bca/packages/vuetify/src/components/VApp/VApp.ts#L37In fact,
$vuetify.theme
is undefined. just like$vuetify.breakpoints
Having the same issue with the beta, did you ever figure this out?
@chaim0m I have just figured it out. Although, to be fair, this was already answered by @MajesticPotatoe in the first reply to this issue, where it states that you must properly instantiate Vuetify as explained in the Alpha 5 release notes. I did that and it works.
In summary do this:
const vuetifyOptions = { }
Vue.use(Vuetify)
new Vue({
el: '#app',
vuetify: new Vuetify(vuetifyOptions)
})
Also, here is a link to a working CodePen https://codepen.io/pbastowski/pen/Rzdqra?editors=1010
I'm doing that in my app (with Vuetify 2.0.6) and all is fine, but in my unit tests I use
let wrapper: Wrapper<MyComponent>
...
wrapper = mount(MyComponent, options)
and I get this error. Not sure how to adjust that for the new Vuetify.
Never mind, I figured it out -- just had to read the docs.
@garyo Could you show me what you did and where in the docs it is? I have the same issue and I already do
const vuetifyOptions = { }
Vue.use(Vuetify)
new Vue({
el: '#app',
vuetify: new Vuetify(vuetifyOptions)
})
Yes -- I followed the test/CustomCard.spec.ts example at https://vuetifyjs.com/en/getting-started/unit-testing.
The keys seem to be:
localVue.use(Vuetify)
beforeEach(() => {
vuetify = new Vuetify(...)
})
and
```
const wrapper = mount(CustomCard, {
localVue,
vuetify, // <<<< IMPORTANT
propsData: {
...
},
})
This error also occurs if you manually render the component:
const Component = Vue.extend(VueComponent)
const instance = new Component({
vuetify, // <-- IMPORTANT
propsData: {
value: true
}
})
instance.$mount()
@chaim0m I have just figured it out. Although, to be fair, this was already answered by @MajesticPotatoe in the first reply to this issue, where it states that you must properly instantiate Vuetify as explained in the Alpha 5 release notes. I did that and it works.
In summary do this:
const vuetifyOptions = { } Vue.use(Vuetify) new Vue({ el: '#app', vuetify: new Vuetify(vuetifyOptions) })
Also, here is a link to a working CodePen https://codepen.io/pbastowski/pen/Rzdqra?editors=1010
When i change like that i'm getting another error
(found in
@DamithaPerera
Do you have a repo or a link to the code that you can share?
Based on the error message it looks like you are creating text based templates and trying to use a version of Vue without a text-template compiler. However, without seeing the code I can't help you much more than this.
@pbastowski
the error occurs when i changed my vuetify version 1.5.18 to 2.2.28
This is my main.js file
import Vue from "vue";
import "./plugins/vuetify";
import App from "./App.vue";
import router from "./router";
import Vuetify from "vuetify";
import "vuetify/dist/vuetify.min.css";
import VueLayers from "vuelayers";
import "vuelayers/lib/style.css";
import * as VueGoogleMaps from "vue2-google-maps";
import Chat from "vue-beautiful-chat";
import VueJWT from "vuejs-jwt";
import {HTTP, CREATEHTTP, AXIOS} from '@/http-common';
Vue.use(VueJWT);
Vue.use(Chat);
Vue.use(Vuetify);
Vue.use(require('vue-moment'));
window.Bus = new Vue();
window.token = localStorage.getItem("token");
window.HTTP = HTTP
window.CREATEHTTP = CREATEHTTP
window.axios = AXIOS
Vue.use(VueLayers);
Vue.use(VueGoogleMaps, {
load: {
key: "AIzaSyA28Qqwtb2jMFPRpve577GdZPXR6K1e--E",
libraries: "places,drawing,visualization"
}
});
Vue.config.productionTip = false;
new Vue({
router,
render: h => h(App)
}).$mount("#app");
This is my App.vue file
<template>
<!-- <div id="app"> -->
<v-app id="app" :style="$vuetify.theme.dark ? ('::-webkit-scrollbar-thumb-black'):('::-webkit-scrollbar-thumb-black')">
<v-layout v-if="showLayout" row>
<v-layout row wrap>
<v-flex>
<Nav :userDetails="userDetails" :theme="theme" @ShrinkMenu="mini = $event" @ClickInbox="inboxMethod"
@ClickAlert="alertMethod"
@ClickSchedule="scheduleMethod"
:inboxClick="inboxClick"
:alertClick="alertClick"
:scheduleClick="scheduleClick" />
<v-layout row>
<Sidebar :mini="mini" @themes="theme = $event" />
<router-view :theme="theme" :style="'background-color:'+theme.background"></router-view>
<v-layout align-start justify-end>
<Notification
:inboxClick="inboxClick"
:theme="theme"
:alertClick="alertClick"
:scheduleClick="scheduleClick"
@ClickInbox="inboxClick = $event"
@ClickAlert="alertClick = $event"
@ClickSchedule="scheduleClick = $event"
style="position:absolute;"
/>
</v-layout>
<!-- <LeftSidebar :minis="minis" @themes="theme = $event" /> -->
</v-layout>
</v-flex>
</v-layout>
</v-layout>
<v-flex xs12 :style="'background-color:'+theme.menubar" v-else class="pl-0 pt-0">
<router-view :theme="theme"></router-view>
</v-flex>
</v-app>
<!-- </div> -->
</template>
<script>
// import func from '../vue-temp/vue-editor-bridge';
import Nav from "@/components/NavComp";
import Sidebar from "@/components/SidebarComp";
import LeftSidebar from "@/components/LeftSidebarComp";
import Notification from "@/components/NotificationNavComp";
export default {
data() {
return {
messageStyling: true,
inboxClick: false,
alertClick: false,
scheduleClick: false,
showLayout: localStorage.getItem("token") != null,
theme: {},
userDetails: [],
mini: null,
// minis: null,
noAuthMenu: [
// {name:"Signup", route:"Signup"},
{ name: "Login", route: "Login" }
],
authMenu: [{ name: "Logout", route: "Logout" }],
participants: [
{
id: "user1",
name: "Matteo",
imageUrl: "https://avatars3.githubusercontent.com/u/1915989?s=230&v=4"
},
{
id: "user2",
name: "Support",
imageUrl:
"https://avatars3.githubusercontent.com/u/37018832?s=200&v=4"
}
], // the list of all the participant of the conversation. `name` is the user name, `id` is used to establish the author of a message, `imageUrl` is supposed to be the user avatar.
titleImageUrl:
"https://a.slack-edge.com/66f9/img/avatars-teams/ava_0001-34.png",
messageList: [
{ type: "text", author: `me`, data: { text: `Say yes!` } },
{ type: "text", author: `user1`, data: { text: `No.` } }
], // the list of the messages to show, can be paginated and adjusted dynamically
newMessagesCount: 0,
isChatOpen: false, // to determine whether the chat window should be open or closed
showTypingIndicator: "", // when set to a value matching the participant.id it shows the typing indicator for the specific user
colors: {
header: {
bg: "#4C4C4C",
text: "#ffffff"
},
launcher: {
bg: "#333333"
},
messageList: {
bg: "#ffffff"
},
sentMessage: {
bg: "#888888",
text: "#ffffff"
},
receivedMessage: {
bg: "#eaeaea",
text: "#222222"
},
userInput: {
bg: "#f4f7f9",
text: "#565867"
}
}, // specifies the color scheme for the component
alwaysScrollToBottom: false, // when set to true always scrolls the chat to the bottom when new events are in (new message, user starts typing...)
messageStyling: true
};
},
components: {
Nav,
Sidebar,
LeftSidebar,
Notification
},
methods: {
inboxMethod:function(e){
this.inboxClick = e
},
alertMethod:function(e){
this.alertClick = e
},
scheduleMethod:function(e){
this.scheduleClick = e
},
sendMessage(text) {
if (text.length > 0) {
this.newMessagesCount = this.isChatOpen
? this.newMessagesCount
: this.newMessagesCount + 1;
this.onMessageWasSent({
author: "support",
type: "text",
data: { text }
});
}
},
onMessageWasSent(message) {
// called when the user sends a message
this.messageList = [...this.messageList, message];
},
openChat() {
// called when the user clicks on the fab button to open the chat
this.isChatOpen = true;
this.newMessagesCount = 0;
},
closeChat() {
// called when the user clicks on the botton to close the chat
this.isChatOpen = false;
},
handleScrollToTop() {
// called when the user scrolls message list to top
// leverage pagination for loading another page of messages
},
handleOnType() {
console.log("Emit typing event");
},
onLoggedIn: function() {
this.menus = this.authMenu;
},
onLogout: function() {
this.menus = this.noAuthMenu;
}
},
created() {
if (localStorage.getItem("theme") == "true") {
this.$vuetify.theme.dark = true;
} else if (localStorage.getItem("theme") == "false") {
this.$vuetify.theme.dark = false;
} else {
localStorage.setItem("theme", "true");
}
Bus.$on("loggedIn", () => {
this.onLoggedIn();
});
Bus.$on("logout", () => {
this.onLogout();
});
this.userDetails = this.$jwt.decode(token);
}
};
</script>
<style>
@import url('https://fonts.googleapis.com/css?family=Rajdhani:300,400,500,600,700&display=swap');
html {
font-family: "Rajdhani", sans-serif;
}
#app {
background-color: #4c4c4c;
font-family: "Rajdhani", sans-serif;
/* user-select: none; supported by Chrome and Opera */
/* -webkit-user-select: none; Safari */
/* -khtml-user-select: none; Konqueror HTML */
/* -moz-user-select: none; Firefox */
/* -ms-user-select: none; Internet Explorer/Edge */
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
border-radius: 10px;
}
::-webkit-scrollbar-track-piece {
background-color: #333333;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background-color: #7b7a7a;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
}
::-webkit-scrollbar-thumb-black {
border-radius: 10px;
background-color: rgb(10, 6, 1);
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
}
::-webkit-scrollbar-track-piece-black {
background-color: #fff7f7;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
}
.semiBold {
font-weight: 600;
}
.sidebar {
font-size: 16px;
text-transform: uppercase;
}
.normalFontSize {
font-size: 16px;
line-height: 21px;
}
.Bold {
font-weight: 700;
}
</style>
Please read the migration guide https://vuetifyjs.com/en/getting-started/releases-and-migrations/#migration-guide. If you need guidance please join us on discord
Most helpful comment
@chaim0m I have just figured it out. Although, to be fair, this was already answered by @MajesticPotatoe in the first reply to this issue, where it states that you must properly instantiate Vuetify as explained in the Alpha 5 release notes. I did that and it works.
In summary do this:
Also, here is a link to a working CodePen https://codepen.io/pbastowski/pen/Rzdqra?editors=1010