路由
资料
- 百度:https://baike.baidu.com/item/%E8%B7%AF%E7%94%B1/363497
- 维基百科:https://zh.wikipedia.org/wiki/%E8%B7%AF%E7%94%B1
概述
- 路由:通过互联的网络把信息从源地址传输到目的地址的活动,就是分发请求的东西,做为硬件就是路由器
- 路由表:存储到各个目的地的最佳路径的表
- 默认路由:hash(#)
- 保底路由:始终让用户看得见的页面(home.html) / 404路由
hash 路由
用url存路径
- 任何情况都可以做的前端路由
- url改变时,页面不会重新加载(#锚点,不会包含在http请求中)
- 缺点:对 seo 不友好(服务器收不到hash)
- 使用 onhashchange 监听 hash变化
window.addEventListener("hashchange", () => {
console.log("hash 变了");
route()
});
history 路由
后端将所有前端路由都渲染到同一页面(error.html),缺点是 IE8 以下不支持
let number = window.location.pathname
number = number || 1; // 保底值,默认路由
window.history.pushState(,,,)
onStateChange(xxx)
function onStateChange(){
console.log("state 变了");
route(app)
}
memory 路由
从localStorage存储
- 缺点是没有url,只对单机有效(单机版路由)
let number = window.localStorage.getItem('xxx')
window.history.pushState(,,,)
window.localStorage.setItem('xxx',,,)
// 通知
onStateChange(,,,)
Vue Router
hash
默认使用 hash 路由, 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。
history
在配置路由规则时,加入"mode: 'history'"
,还是使用 pushState()
或 replaceState()
const router = new VueRouter({
mode: 'history',
routes: [...]
})
还需要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是 app 依赖的页面。
export const routes = [
{path: "/", name: "homeLink", component:Home}
{path: "/register", name: "registerLink", component: Register},
{path: "/login", name: "loginLink", component: Login},
{path: "*", redirect: "/"}
]
// 如果URL输入错误或者是URL 匹配不到任何静态资源,就自动跳到到Home页面
实现页面跳转
- 直接修改地址栏
this.$router.push(‘路由地址’)
<router-link to="路由地址"></router-link>
使用 Vue Router
文档:https://router.vuejs.org/zh/installation.html
安装
// npm
npm install vue-router
// 全局 script
<script src="/path/to/vue.js"></script>
<script src="/path/to/vue-router.js"></script>
// main.js
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
demo
// HTML
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>
// JS
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
const router = new VueRouter({
routes // (缩写) 相当于 routes: routes
})
const app = new Vue({
router
}).$mount('#app')