前端路由: 根据不同分Hash地址,切换不同的组件
监听Hash值的改变切换不同组件
hash值改变时触发
window.onhashchange = function(){
location.hash(获取hash值)
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
<a href="#/a">a</a>
<a href="#/b">b</a>
<a href="#/c">c</a>
<component :is="comname"></component>
</div>
<script type="text/javascript">
Vue.component('com1', {
template: '<h3>组件a</h3>'
})
Vue.component('com2', {
template: '<h3>组件b</h3>'
})
Vue.component('com3', {
template: '<h3>组件c</h3>'
})
var vm = new Vue({
el: '#app',
data: {
comname: 'com1'
},
methods: {},
mounted(){
window.onhashchange = () => {
// console.log(location.hash);
switch(location.hash){
case '#/a':
this.comname = 'com1';
break;
case '#/b':
this.comname = 'com2';
break;
case '#/c':
this.comname = 'com3';
break;
}
}
}
})
</script>
</body>
</html>
vue-router的基本使用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../lib/vue-2.4.0.js"></script>
<!-- 1、导入vue-router.js -->
<script src="../lib/vue-router-3.0.1.js"></script>
</head>
<body>
<div id="app">
<!-- 6、表示路由连接, router-link标签默认渲染为 a标签 -->
<!-- teg属性改变默认渲染的标签 -->
<router-link to="/login" teg="span">登录</router-link>
<router-link to="/reg">注册</router-link>
<!-- 5、<router-view>标签 相当于路由的容器。用来把匹配到hash值的组件,呈现到这个容器中 -->
<!-- <router-view>默认不会渲染成任何标签 -->
<router-view></router-view>
</div>
<script type="text/javascript">
// Vue.component('login', {
// template: '<h3>登录组件</h3>'
// });
// Vue.component('reg', {
// template: '<h3>注册组件</h3>'
// });
// 2、创建对应的组件对象
const login = {
template: '<h3>登录组件</h3>'
};
const reg = {
template: '<h3>注册组件</h3>'
};
// 3、创建一个路由对象。当导入完 vue-router 之后,在浏览器全局,就有了 VueRouter 构造函数了
// 可以监听到hash值改变
const router = new VueRouter({
routes: [//路由规则的数组
{path: '/login', component: login},//路由规则中,path表示要匹配的hash值。component表示hash值对应的要展示的组件对象
{path: '/reg', component:reg},
// 挂载好的路由,想要在页面中展示出来,需要用到<router-view>标签
]
});
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router//4、想要路由在页面指定部分使用,需要在该实例中,通过router属性挂载到这个实例中
// 属性名和属性值一样,可以简写为router
})
</script>
</body>
</html>
路由切换选中状态的高亮样式、切换的动画效果
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../lib/vue-2.4.0.js"></script>
<script src="../lib/vue-router-3.0.1.js"></script>
<style type="text/css">
.my-active{
font-size: 30px;
color: #DDA0DD;
}
.v-enter{
opacity: 0;
transform: translateX(100px);
}
.v-leave-to{
opacity: 0;
transform: translateX(-100px);
}
.v-enter-active,
.v-leave-active{
position: absolute;
transition: all 0.5s ease;
}
</style>
</head>
<body>
<div id="app">
<router-link to="/login" tag="span">登录</router-link>
<router-link to="/reg">注册</router-link>
<transition mode="out-in">
<router-view></router-view>
</transition>
</div>
<script type="text/javascript">
const login = {
template: '<h3>登录组件</h3>'
};
const reg = {
template: '<h3>注册组件</h3>'
};
const router = new VueRouter({
routes: [
// {path: '/', component: login},
{path: '/', redirect: '/login'},//当监听到路径为根路径的时候,重新跳转到 '/login' 路径
{path: '/login', component: login},
{path: '/reg', component: reg}
],
linkActiveClass: 'my-active'
})
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router
})
</script>
</body>
</html>