零、传统路由与SPA的区别

  • 传统开发方式下,URL改变后,就会立刻发生请求去请求整个页面,这样可能请求加载的资源过多,可能会让页面出现白屏。
  • 在SPA(Single Page Application)单页面应用下,当锚点值改变后,不会立刻发生请求,而是在某个合适的时机,发起ajax请求,实现局部改变页面的数据。优点是:不是整个页面发生跳转,那么用户的体验就更好了。

一、vue-router的使用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body> <div id="app">
</div> <!-- 1. 先引入vue.js(被vue-router所依赖)-->
<script src="../node_modules/vue/dist/vue.js"></script>
<!-- 2. 再引入插件vue-router(使用npm install vue-router --save安装到相应的文件夹下)-->
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
<script> /* 演示示例:页面里有2个a标签,注册和登录,点击注册、登录返回不同的内容,
且有公共内容(主页公共数据),来实现局部页面的跳转且URL要发生相应的改变。
*/ // 3. 让vue使用VueRouter创建(某些情况下可以不用,这里暂且加上)
Vue.use(VueRouter); // 声明使用了路由的组件
var Login = {
template: `
<div>我是登录页面</div>
`
}; var Register = {
template: `<div>我是注册页面</div>`,
}; // 4. 创建VueRouter对象
var router = new VueRouter({
// 5. 配置路由对象的规则如匹配路径、组件等
routes: [
{
path: '/login',
component: Login
},
{
path: '/register',
component: Register
}
] }); // 当使用了vue-router后就会抛出两个全局的组件:router-link、router-view
// router-link相当于a标签,router-view是路由组件渲染的出口 // 声明入口组件App
var App = {
template: `
<div>
我是公共内容<br/>
<router-link to='/login'>登录</router-link>
<router-link to='/register'>注册</router-link> <router-view></router-view>
</div>
`,
}; new Vue({
el: '#app',
// 5. 将配置后的路由对象关联到vue实例化对象中
router: router,
template: `<App />`,
components: {
App
}
}); </script>
</body>
</html>

命名路由

路由也可以拥有自己的名字,上面的例子也可以改写为下面:

      routes: [
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/register',
name: 'register',
component: Register
}
]
... <router-link :to='{name:"login"}'>登录</router-link>
<router-link :to='{name:"register"}'>注册</router-link>

路由参数

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body> <div id="app">
</div> <script src="../node_modules/vue/dist/vue.js"></script>
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
<script> /*
路由参数的使用:常见的路由范式有以下2种:
- xxx.html/user/1 params 动态路由参数(restful风格)
- xxx.html/user?userId=1 query 查询参数
*/
Vue.use(VueRouter); // 声明使用了路由的组件
var Login = {
template: `
<div>我是登录页面</div>
`
}; var Register = {
template: `<div>我是注册页面</div>`,
}; var router = new VueRouter({
routes: [
{
// 动态路由参数以冒号开头
path: '/login/:id',
name: 'login',
component: Login
},
{
// query参数在这里不做修改
path: '/register',
name: 'register',
component: Register
}
] }); // 声明入口组件App
var App = {
template: `
<div>
我是公共内容<br/>
<router-link :to = "{name:'login',params:{'id':1}}">登录params</router-link>
<router-link :to = "{name:'register',query:{'userId':2}}">注册query</router-link> <router-view></router-view>
</div>
`,
}; new Vue({
el: '#app',
router: router,
template: `<App />`,
components: {
App
}
}); </script>
</body>
</html>

二、嵌套路由、动态路由

掘金就是由vue写的,接下来的这个demo会模仿掘金首页的构成,实现嵌套路由、动态路由匹配功能。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>掘金</title>
</head>
<body>
<div id="app"> </div> <script src="../node_modules/vue/dist/vue.js"></script>
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
<script> Vue.use(VueRouter); //第二层路由组件,实现了嵌套的路由组件
// 这一层的三个路由组件:推荐、后端、前端可以看成结构是相同的,只有数据不同
// 所以为了提高代码的复用性,就需要采用动态路由匹配的方式,及只创建一个组件,然后替换里面的数据
var Home = {
template: `
<div>
<router-link :to="{name:'category', params:{category:'recommened'}}">推荐</router-link>
<router-link :to="{name:'category', params:{category:'backend'}}">后端</router-link>
<router-link :to="{name:'category', params:{category:'fronted'}}">前端</router-link> <router-view></router-view> </div>
`
}; var Pins = {
template: `<div>我是沸点</div>`
}; var Topics = {
template: `<div>我是话题</div>`
}; // 创建一个组件,然后使用动态路由匹配的方式
var Commons = {
data() {
return {
msg: 'recommened'
}
},
template: `
<div>
我是 {{ msg }}
</div>
`,
watch: {
// 利用watch侦听器来监听$route来检测动态路由的切换
'$route' (to, from) {
console.log(to.params.category); // 模拟路由的变化引起的数据的变化
this.msg = to.params.category;
}
}
}; var router = new VueRouter({
routes: [
{
path: '/',
component: Home,
// 嵌套路由的写法:
children: [
{
path: 'welcome/:category',
name: 'category',
component: Commons
}
]
},
{
path: '/pins',
component: Pins
},
{
path: '/topics',
component: Topics
}
]
}); // 第一层路由组件包括首页、沸点、话题等
var FRouter = {
template:`
<div>
第一层路由组件
<router-link to="/">首页</router-link>
<router-link to="/pins">沸点</router-link>
<router-link to="/topics">话题</router-link> <router-view></router-view>
</div>
` }; new Vue({
el: '#app',
router: router,
template: '<FRouter />',
components: {
FRouter
}
});
</script>
</body>
</html>

最新文章

  1. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
  2. 《转》Unity3D研究院编辑器之5.3JSON的序列化
  3. UGUI text image 等加Shadow OutLine等
  4. secure erase 时必须umount
  5. DAC使用基本准则
  6. 阿里巴巴2013年实习生笔试题A
  7. mysql主从数据库复制
  8. 配置Jenkins的slave节点的详细步骤适合windows等其他平台(转)
  9. Power oj2470/DFS
  10. J-Link驱动下载和Hex程序下载
  11. PHP解码unicode编码中文字符代码
  12. js数据结构与算法——字典与散列表
  13. video 自动循环播放
  14. MySQL中的isnull、ifnull和nullif函数用法
  15. 去BAT,你应该要看一看的面试经验总结(转)
  16. JDK安装教程(Windows7 x64)
  17. Spark源码的编译过程详细解读(各版本)(博主推荐)
  18. jmeter控制器(二)
  19. sublime text3 php开发必要的插件
  20. 方法 中 void 的解释

热门文章

  1. 详解ElasticAPM实现微服务的链路追踪(NET)
  2. 学习JAVAWEB第十五天
  3. Idea内存设置idea.vmoptions无效的解决办法
  4. STL priority_queue 优先队列 小记
  5. Spring service本类中方法互相调用事物失效问题
  6. Maven仓库的目录结构
  7. Jvm和CPU保证特定情况下不乱序
  8. Google hacker
  9. Static块和类加载顺序
  10. iOS - TableViewCell分割线 --By吴帮雷