🥝 前端路由的特点:
❤️优点:
用户体验好,不需要每次都从服务器全部获取,可以快速展现给用户。
💔缺点:
👋 不利于SEO。
👋 使用浏览器的前进后退时回重新发送请求,没有合理地利用缓存。
👋 单页面无法记住之前滚动的位置,无法在前进、后退的时候记住滚动的位置。
🥝 vue-router的基本使用
资料原文
路由其实就是“指向”的意思,当我点击页面上的home按钮时,页面上就要显示出home的内容,如果点击页面上的about按钮,页面上就要显示出about的内容。点击之后,怎么做到正确的对应,比如,我点击home按钮,页面上怎么正好能显示home的内容。这就要在js文件中配置路由。
路由中有三个基本概念:route,routes,router
1⃣️ route:它是一条路由,由这个英文单词也可以看出来,它是单数。Home按钮 => home内容, 这是一条route;about按钮 => about 内容, 这是另一条route。
2⃣️ routes:routes 是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]
3⃣️ router:router 是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了 home 内容。
4⃣️ 客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。客户端路由有两种实现方式:基于hash 和基于html5 history api.
🥝 vue-router路由两种实现途径
在vue中实现路由还是相对简单的。因为我们页面中所有内容都是组件化的,我们只要把路径和组件对应起来就可以了,然后在页面中把组件渲染出来。
1⃣️页面实现(html模版中)
在vue-router中, 我们看到它定义了两个标签<router-link> 和<router-view>来对应点击和显示部分。<router-link> 就是定义页面中点击的部分,<router-view> 定义显示部分,就是点击后,区配的内容显示在什么地方。所以 <router-link> 还有一个非常重要的属性 to,定义点击之后,要到哪里去, 如:<router-link to="/home">Home</router-link>
2⃣️js 中配置路由
首先要定义route, 一条路由的实现。它是一个对象,由两个部分组成: path和component. path 指路径,component 指的是组件。如:{path:’/home’, component: home}
我们这里有两条路由,组成一个routes:
const routes = [
{ path: '/home', component: Home },
{ path: '/about', component: About }
]
最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。
const router = new VueRouter({
routes // routes: routes 的简写
})
配置完成后,把router 实例注入到 vue 根实例中,就可以使用路由了。
const app = new Vue({
router
}).$mount('#app')
执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 <router-view> 标签所在的地方。所有的这些实现才是基于hash 实现的。
🥝 动态路由
上面我们定义的路由,都是严格匹配的,只有router-link 中的to属性和 js 中一条路由route中 path 一模一样,才能显示相应的组件component. 但有时现实却不是这样的,当我们去访问网站并登录成功后,它会显示 欢迎你+ 你的名字。不同的用户登录, 只是显示“你的名字” 部分不同,其它部分是一样的。
我们经常需要把某种模式匹配到的所有路由,全部映射到同一个组件。例如,有一个User组件,对于所有ID各不相同的用户,都要用这个组件来渲染。那么,我们可以在vue-router的路由路径中使用【动态路径参数】。
当使用路由参数时,例如从/user/foo导航到/user/bar,原来的组件实例会被复用。因为两个路由都渲染同一个组件,比起销毁再创建,复用则显得更加高效。这也意味着组件的生命周期钩子不会再被调用。
例如:
const User = {
template: '<div>User</div>
}
const router = new VueRouter({
routes: [
// 动态路径参数,以冒号开头
{ path: '/user/:id', component: User }
]
})
🥝 嵌套路由
嵌套路由,主要是由我们的页面结构所决定的。当我们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当我们点击各个分类的时候,它还是需要路由到各个部分,如点击手机,它肯定到对应到手机的部分。
在路由的设计上,首先进入到 home ,然后才能进入到phone, tablet, computer. Phone, tablet, compute 就相当于进入到了home的子元素。所以vue 提供了childrens 属性,它也是一组路由,相当于我们所写的routes。
例如:
const routes = [
{
path:"/home",
// 下面这个属性也不少,因为,我们是先进入home页面,才能进入子路由
component: home,
// 子路由
children: [
{
path: "phone",
component: phone
},
{
path: "tablet",
component: tablet
},
{
path: "computer",
component: computer
}
]
}
];
🥝 命名路由
命名路由,很简单,因为根据名字就可以知道,这个路由有一个名字,那就直接给这个路由加一个name 属性,就可以了。 给user 路由加一个name 属性:
{
path: "/user/:id",
name: "user",
component: user
}
命名路由的使用, 在router-link 中to 属性就可以使用对象了,
<router-link to="/user/123">User123</router-link> // 和下面等价
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
// 当使用对象作为路由的时候,to前面要加一个冒号,表示on-bind绑定,否则会被当成对象
🥝 编程式路由
除了使用< router-link >创建a标签来定义导航链接,还可以借助router的实例方法,通过编写代码实现。
想要导航到不同的URL,则使用router.push方法。这个方法会向history栈添加一个新纪录,所以,当用户点击浏览器后退按钮时,则回到之前的URL.
当点击< router-link >时,这个方法会在内部调用,所以说,点击< router-link :to=”…”>等同于调用router.push(…)
语法 this.$router.history.push('要跳转路由的地址'),push里面的参数有三种写法,如下:
<script>
export default {
methods:{
toCart(){
//this.$router.push("/carts");
//this.$router.push({path:"/carts"});
this.$router.push({path:"/carts?a=123"});
}
}
}
</script>
网友评论