Reputation: 705
I am new to vuejs and have some questions when using it. I create a root view, with 2 child component in it, the rootview.vue file looks like this:
<template>
<div id="rootView">
<calendar-top-view></calendar-top-view>
<calendar-bottom-view></calendar-bottom-view>
</div>
</template>
<script>
import calendarTopView from './calendarTopView.vue'
import calendarBottomView from './calendarBottomView.vue'
export default {
components: {
'calendar-top-view': calendarTopView,
'calendar-bottom-view': calendarBottomView
}
}
</script>
and in calendar-bottom-view component, I need to use vue-router to help switch between to child components: calendarView and agendaView. So I decide to add vue-router just in my calendar-bottom-vue component, and the code looks like below:
<template>
<div id='mainRightDiv'>
<div id='calendarToolboxDiv'>
<a v-link='{ path: "/calenarView"}'></a>
<a v-link='{ path: "/agendaView"}'></a>
</div>
<router-view></router-view>
</div>
</template>
<script type="text/javascript">
import Vue from 'vue'
import calendarView from './calendarView.vue'
import agendaView from './agendaView.vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
let App = Vue.extend({})
let router = new VueRouter()
router.map({
'/calendarView': {
component: calendarView
},
'/agendaView': {
component: agendaView
}
})
export default {
ready: function () {
router.go({ path: '/calendarView'})
}
}
</script>
What I intend to do is to let the router to render calendarView first when the component is initialized. But when I run this page, I got error message like
'router-view> can only be used inside a router-enabled app.'
I checked the official spec of vue-router and found in its demo code, vue-router was used in entry js of the demo app, not found any use in any child component.
So I wonder, how can I use vue-router in one of my child component, instead of root?
Upvotes: 6
Views: 7266
Reputation: 186
Assuming you use Browserify with Vueify, you create .js
file, which should have structure:
var Vue = require('vue');
var Router = require('vue-router');
Vue.use(Router);
Vue.config.debug = true;
//any other npm packages
import Alert from './components/Alert.vue';
import SubVue1 from './pages/Subvue1.vue';
import SubVue2 from './pages/Subvue2.vue';
import Bar from './pages/Bar.vue';
import Baz from './pages/Baz.vue';
var App = Vue.extend({
data: function () {
return {
//any ViewModel data
}
},
components: {Alert}
});
var router = new Router();
router.map({
// Not found handler
'*': {
component: {
template: '<div class="text-align:center">' +
'<h1>Not Found</h1>' +
'</div>'
}
},
'/sub1': {
name: 'subvue1',
component: SubVue1
},
'/sub2': {
name: 'subvue2',
component: SubVue2
// add a subRoutes map under /foo
subRoutes: {
'/bar': {
// Bar will be rendered inside Foo's <router-view>
// when /foo/bar is matched
component: Bar
},
'/baz': {
// Same for Baz, but only when /foo/baz is matched
component: Baz
}
}
}
});
router.start(App, 'body'); // #app,.start -as you wish
Note that I use vue-router in the root parent .js
file.So basically when you enter /sub1, then Subvue1.vue is loaded. Pay attention to subroutes (calendarView and agendaView switch). Every SubVue,Bar,Baz should have structure:
<template>
<router-view><router-view> //For Subvue2 subroute
</template>
<script>
export default {
props: ['parentProperty'],
data: function () {// data}
methods:{}
}
<style></style>
Read Vue Router docs for more info.
Upvotes: 2