路由
SPA 单页面应用
一个项目里 只有一个HTML页面
一旦页面加载完成,SPA不会因为用户的操作而进行页面的重新加载或者跳转
利用JS动态变换HTML内容,模拟多个视图切换
路由
功能
- 改变url 不向服务器发送请求
- 可以监听url变化
- 不刷新 页面的前提下 改变浏览器url地址
hash
- 原理:在 url 中的 # 之后对应的是 hash 值, 其原理是通过hashChange() 事件监听hash值的变化, 根据路由表对应的hash值来判断加载对应的路由加载对应的组件
- 优点:
- 不需要后端参与
- 兼容性好IE8
- hash改变不会向后端发送请求
- 缺点:
- hash值前加# 不符合url规范 不美观
history
- 优点:
- 符合url规范 美观
- 缺点:
- 用户手动输入地址 或 刷新页面 需要配置index页面 防止404
- 兼容性差IE10 因为利用了 HTML5 History对象中新增的 pushState() 和 replaceState() 方法,需要特定浏览器的支持.
- 路由变量path
- 仅修改页面url 不发送请求
- back():后退到上一个路由;
- forward():前进到下一个路由,如果有的话;
- go(number):进入到任意一个路由,正数为前进,负数为后退;
- pushState(obj, title, url):前进到指定的 URL,不刷新页面;
- replaceState(obj, title, url):用 url 替换当前的路由,不刷新页面;
- 改变url 会导致浏览器向服务器发送请求,如果匹配不到任何静态资源 应返回同一个html页面
hash | history | |
---|---|---|
定义 | 以前url用的锚点,用于定位页面展示内容 url中#后面的字符串 | 路由变量pathname |
通过hashChange() 事件监听hash值的变化, 根据路由表对应的hash值来判断加载对应的路由加载对应的组件,渲染不同内容,不像服务器发请求,不需要服务器支持 | 监听url路径变化 需要客户端和服务器支持 | |
原理 | 获取页面的hash值 相当于直接获取路由变量,实现按需加载子页面 | 通过history.pushState(state,title,url) 改变url内容 但是不刷新页面,比hash美观 |
是一个真实的url | 虚假的url 像在地址栏输入url 但是没有回车 回车会崩溃(服务器刷新404) 解决方法 :将所有页面的请求重定向到初始页面,在最外层写一个地址解析,相当于获取路由所需要的参数 | |
传数据 | 传递复杂数据 会有体积的限制 | 不仅可以放参数,还可以存放在一个特定对象中 |
兼容性 | IE8更好 | IE10 |
参考
(https://my.oschina.net/u/4357035/blog/3313883)
vue3 路由Demo
- router/index.js
import {createRouter, createWebHistory} from "vue-router"
// import {createWebHistory,createWebHashHistory} from "vue-router"
// 定义路由组件 和 路由配置
const routes = [
{
path:'/',
component:()=> import('../components/HelloWorld.vue')
},
{
path: '/a',
component: () => import('../components/a.vue'),
children: [
{
path: '',
name: 'a1',
component: () => import( '../components/a1.vue')
},
{
path: 'a2',
name: 'a2',
component: () => import('../components/a2.vue')
}
]
}
]
// 创建路由实例
const router = createRouter({
// 采用hash 模式
// history: createWebHashHistory(),
// 采用 history 模式
history: createWebHistory(),
routes, //使用上方定义的路由配置
});
// const router = new Router({ mode: 'history', routes })
// 导出路由
export default router
main.js
import { createApp } from 'vue' import App from './App.vue' import router from './router' // const app = createApp(App) // app.use(router) // app.mount('#app') createApp(App).use(router).mount('#app')
vue2 路由Demo
vue2默认hash
- router/index.js
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const routes =[
{
path:'/',
name:'Aside',
component: ()=> import( '../components/Aside.vue')
},
{
path:'/Main',
name:'Main',
component: ()=> import ('../components/Main.vue'),
children:[{
path:'',
name:'Top',
component:()=> import('../components/HelloWorld.vue')
},{
path:'footer',
name:'Foot',
component:()=> import('../components/Foot.vue')
}]
}
]
const router = new Router({ routes })
export default router
main.js
import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false new Vue({ router, render: h => h(App), }).$mount('#app')