路由vue-router
2019-04-01 本文已影响0人
没了提心吊胆的稗子
前后端分离, 后端只负责提供接口供前端使用,页面跳转都是前端自己实现,有两种方式:
1、hash模式# 开发时使用,不会导致404问题,不支持seo
2、h5的history.pushState 上线采用
路由四部曲:
1、映射表: 配置路径匹配哪个组件,这里的组件都是页面级组件
2、映射表注册:在VueRouter的实例里面注册
3、路由注册:在当前vm实例上注册
4、渲染:注册完之后要把组件的内容渲染到页面中,通过<router-view></router-view>
<router-link to="/home" tag="button">首页</router-link>
跳转页面,不设置mode
属性指定history
方式就会默认使用hash
。history
方式要设置默认页面。tag
属性表示想要这个标签以什么方式出现在页面上,此处是按钮,默认是超链接
<body>
<div id="app">
<!-- vue自带的全局组件 注册完组件之后把内容渲染到页面-->
<!--4、把内容渲染到页面-->
<router-view></router-view>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<!--必须放在vue后面-->
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
<script>
let home = {template: '<div>首页</div>'};
let list = {template: '<div>列表</div>'};
let routes = [ //1、 映射表(数组) 页面级组件 一个页面就是一个组件
{path: '/home', component: home},
{path: '/list', component: list}
];
let router = new VueRouter({ // 引入vue-router自带VueRouter类
// 2、映射表注册
routes
});
let vm = new Vue({
el: '#app',
// 3、路由注册
router,
});
</script>
</body>
路由的编程式导航,在js中跳转页面,每个组件都会有route(存属性)两个属性
let home = {
template: '<div>home<button @click="toList">去列表</button></div>',
methods: {
toList() {
this.$router.push('/list'); // 强制跳转路径
//this.$router.replace('/list'); // 路由替换,会把当前的替换掉
}
}
};
let list = {
template: '<div>list<button @click="toHome">去首页</button></div>',
methods: {
toHome() {
this.$router.go(-1); // 返回上一级
// this.$router.back(); // 返回上一级 一样的
}
}
};
let routes = [
{path: '', component: home}, // 默认展示页面
{path: '/home', component: home},
{path: '/list', component: list},
// {path: '*', component: home},// 都匹配不到的时候
{path: '*', redirect: '/home'} // 组件也要切换 404的时候
];
路由嵌套
{
path: '/detail',
component: detail,
children: [// 子路由的路径不能写/带/表示一级路由
{path: 'profile', component: profile},
{path: 'about', component: about}
]
}
路由传参 方式1:直接传递
let article = {template: '<div>第{{this.$route.params.c}}篇文章</div>'};
let routes = [
{
// /article/1
// /article/:c => {C: 1}=this.$route.params.c
path: '/article/:c', // 表示必须有值但值是随机的
component: article
}
];
方式2:使用对象作为to的属性并且使用参数,这种方法要求必须给路由起个名字,通过名字跳转,路径变化时用watch
监听来发送ajax
<router-link :to="{name: 'pro', params: {c: 1}}">商品1</router-link>
<script>
let article = {
template: '<div>第{{this.$route.params.c}}篇文章</div>',
watch: { // 路径参数发生变化 监控参数的变化发送ajax
$route(){
alert('发送ajax');
}
}
};
let routes = [
{
path: '/article/:c', // 表示必须有值但值是随机的,
name: 'pro',
component: article
}
];
</script>
改了好久才发现是因为没有渲染
<router-view></router-view>
都是粗心惹的祸