console
var ComponentA = {
template: '<div>{{content}}</div>',
data: function(){
return {
content: 'test component-a content'
}
}
};
var ComponentB = {
template: '<div> {{ name }} </div>',
data: function(){
return {
name: 'my name is component-b, hello!'
}
}
};
var ComponentC = {
template: '<div> {{ $route.params.userId }} </div>',
data: function(){
return {
testThis: 'haha'
}
},
beforeRouteEnter: function(to, from, next){
console.log('组件内部BeforeRouteEnter');
next(function(vm){
console.log('组件实例化后,执行回调', vm.testThis);
});
},
beforeRouteUpdate: function(to, from, next){
console.log('组件内部的beforeRouteUpdate守卫');
next();
},
beforeRouteLeave: function(to, from, next){
console.log('组件内部的beforeRouteLeave守卫,在导航发生变化,该组件失活时调用');
next();
}
};
var ComponentD = {
template: `
<div class="nest-component">
嵌套路由,即允许在任意一个组件内部再次进行路由映射,即可以在组件内部提供路由映射的视图router-view
<div>
<router-link :to="'/test/user/' + $route.params.userName + '/info'">用户C的个人信息模块</router-link>
<router-link :to="'/test/user/' + $route.params.userName + '/technology'">用户C的技能模块</router-link>
</div>
<router-view></router-view>
</div>
`,
beforeRouteLeave: function(to, from, next){
console.log('组件D的beforeRouteLeave');
next();
}
};
var InforComponent = {
template: `
<div>
<div>name: {{$route.params.userName}}</div>
<div>sex: 女</div>
</div>
`,
};
var TecComponent = {
template: `
<div>
<div>技能1</div>
<div>技能2</div>
<div>技能3</div>
</div>
`,
};
var UserDefaultComponent = {
template: `
<div>
默认是个人首页
</div>
`,
};
var GrammerRouter = {
template: `
<div @click="clickRouter">
点击后利用程序编程实现跳转{{userId}}
</div>
`,
data: function(){
return {
userId: 'liangliang'
};
},
methods: {
clickRouter: function(){
this.$router.push({name: 'userId', params: {
userId: this.userId,
}});
},
}
};
var NameRouter = {
template: `
<div>
<div>命名视图,同级下有多个router-view,给view命名,分别做映射</div>
<div>
<router-link to="/namerouter">点击变换路径,然后多个router-view视图同时根据一个路由进行各组件的渲染</router-link>
</div>
<div>
<router-view class="header" name="view1"></router-view>
<router-view class="main" name='view2'></router-view>
<router-view class="default"></router-view>
</div>
</div>
`,
};
var View1Component = {
template: '<div> 我是view1 </div>',
};
var View2Component = {
template: '<div> 我是view2 </div>'
};
var DefaultViewComponent = {
template: '<div> 我是默认view </div>'
};
const routes = [
{path: '/', component: ComponentA},
{path: '/test', component: ComponentB},
{
path: '/test/:userId',
name: 'userId',
component: ComponentC,
beforeEnter: function(to, from, next){
console.log('路由userId的独享钩子beforeEnter', to );
next();
},
},
{
path: '/test/user/:userName',
component: ComponentD,
children: [
{path: 'info', component: InforComponent},
{path: 'technology', component: TecComponent},
{path: '', component: UserDefaultComponent},
]
},
{
path: '/namerouter',
components: {
'view1': View1Component,
'view2': View2Component,
default: DefaultViewComponent,
}
}
];
const router = new VueRouter({
routes: routes,
});
router.beforeEach(function(to, from, next){
console.log('beforeEach守卫');
next();
});
router.beforeResolve(function(to, from, next){
console.log('beforeResolve守卫,导航被确认之前');
next();
});
router.afterEach(function(to, from){
console.log('afterEach 导航被确认之后 导航不可被修改');
});
new Vue({
el: '#app',
data: {
test: 'test',
},
components: {
'grammer-router': GrammerRouter,
'name-router': NameRouter,
},
router: router,
});
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
{{test}}
<router-view></router-view>
<div>
<router-link to="/">首页</router-link>
<router-link to="/test">测试模块</router-link>
<router-link to="/test/userA">用户A</router-link>
<router-link to="/test/userB">用户B</router-link>
<router-link to="/test/user/chaochao">用户超超</router-link>
</div>
<div>
使用编程式导航
<grammer-router></grammer-router>
</div>
<div>
命名视图
<name-router></name-router>
</div>
</div>