Vue两种路由模式的实现

Vue的路由模式

两种模式:hash,history
hash的原理完全是前端方法构成:监听hashchange事件,判断路由的跳转
history的原理则需要后端配合:HTML5新增的history相关的api,history。pushState() history.replaceState() 监听popstate事件,判断前进还是后退
上线前的操作也不同:
hash:不需要额外的操作
history:需要服务器管理人员(运维)配置相关的nginx。如果不做这个相关的配置处理的话,就会有404问题。

小知识点

npm包:history.js。里面提供了很多导航方法

// 使用history模式
import { createBrowserHistory } from "history";

// 许多的导航方法
history.push(to: To, state?: State)
history.replace(to: To, state?: State)
history.go(delta: number)
history.back()
history.forward()

hash

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
	<ul>
		<li><a href="#/a">去a页面</a></li>
		<li><a href="#/b">去b页面</a></li>
		<li><a href="#/c">去c页面</a></li>
		<li><a href="#/d">去d页面</a></li>
	</ul>

	<div id="route-view"></div>

<script type="text/javascript"> 

// 获取元内容素
var ctn = document.getElementById('route-view') 

// 默认渲染
render('/a')

// 监听hashchange事件 
window.addEventListener('hashchange',function(){
	render(location.hash.slice(1)) 
})

// 分支
function render(router){
    switch (router) {
        case '/a':
        ctn.innerHTML = '这是a页面'
		break;

		case '/b':
		ctn.innerHTML = '这是b页面'
		break;

		case '/c':
		ctn.innerHTML = '这是c页面'
		break;

		case '/d':
		ctn.innerHTML = '这是d页面'
		break;
		
		default:
		ctn.innerHTML = '404页面' 
		break;
	}
}
</script>
</body>
</html>

history

前端部分

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>


<a href="javascript:toA();">A页面</a>
<a href="javascript:toB();">B页面</a>
<a href="javascript:replaceC();">C页面</a>
<div id="app"></div>
<script>
	render()
  	function render() {
  		// console.log(window.location)
  		console.log(window.history)
    	app.innerHTML = window.location.pathname
  	}
  	function toA() {
    	history.pushState({}, null, '/a')
    	render()
  	}
  	function toB() {
    	history.pushState({}, null, '/b')
    	render()
  	}

  	function replaceC() {
    	history.replaceState({}, null, '/c')
    	render()
  	}

  	window.addEventListener('popstate', render)
</script>

</body>
</html>

后端部分

const http = require('http')
const fs = require('fs')
const httpPort = 3003

http.createServer((req, res) => {
	
  fs.readFile('index.html', 'utf-8', (err, content) => {
    if (err) {
      console.log('We cannot open "index.html" file.')
    }

    res.writeHead(200, {
      'Content-Type': 'text/html; charset=utf-8'
    })

    res.end(content)
  })
}).listen(httpPort, () => {
  console.log('Server listening on: http://localhost:%s', httpPort)
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抬头第一眼,是天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值