一、什么是SPA
SPA全称(single page Aplication)单页面应用
目前在项目开发过程中只会存在一个HTML文件,在这个文件中动态引入组件,通过组件的自由搭配,实现页面上不同布局的优势
在Vue项目,public文件夹存在index.html,这个就是唯一的html,以后所有的代码都在vue文件写,动态显示到html中就实现加载效果
二、SPA的实现过程
- 首先配置一级路由
在views文件夹下下面创建三个页面
Login.vue登录页面
regist.vue注册页面
Home.vue主页页面
在路由注册文件配置映射关系
import VueRouter from 'vue-router';
import Vue from 'vue';
import Home from '../components/home.vue'
import Regist from '../components/regist.vue'
import Login from '../components/login.vue'
Vue.use(VueRouter)
const routes = [
{
path:'/',
name:'Home',
component:Home
},
{
path:'/regist',
name:'Regist',
component:Regist
},
{
path:'/login',
name:'Login',
component:Login
}
]
const router = new VueRouter({
mode:'history',
base:process.env.BASE_URL,
routes
})
export default router
注意:
这里面我没有采用路由的懒加载,如果需要懒加载可以采用下面这种方法
{
path:'/login',
name:'Login',
component:()=>import('../view/Login.vue') 懒加载
}
2、第二步嵌套路由(二级路由)
在Home主页中我们能需要引入外部很多组件,实现动态切换
优先考虑的使用嵌套路由来实现,暂时没有考虑动态组件来实现
import VueRouter from 'vue-router';
import Vue from 'vue';
import Home from '../components/home.vue'
import Regist from '../components/regist.vue'
import Login from '../components/login.vue'
import Main from '../views/subs/Main.vue'
import student from '../views/subs/student.vue'
import teacher from '../views/subs/teacher.vue'
import classes from '../views/subs/classes.vue'
Vue.use(VueRouter)
const routes = [
{
path:'/',
redirect:'/login'
},
{
path:'/',
name:'Home',
component:Home,
children:[
{
path:'/',
name:'Main ',
component:Main
},
{
path:'student',
name:'studentt',
component:student
},
{
path:'teacher',
name:'taeacher',
component:teacher,
},
{
path:'classes',
name:'classes',
component:classes
}
]
},
{
path:'/regist',
name:'Regist',
component:Regist
},
{
path:'/login',
name:'Login',
component:Login
}
]
const router = new VueRouter({
mode:'history',
base:process.env.BASE_URL,
routes
})
export default router
注意:
嵌套路由路径前面不要添加“ / ”。
Home中动态加载路由,必须在Home这个组件内部配置渲染出口
<template>
<div class="main">
<div class="leftNav">
<ul>
<li
v-for="item in menus" :key="item.id"
@click="changeCheck(item.id)"
:class='{check:currentTag==item.path}' >
<i :class=' item.icon '></i>
<router-link :to="item.path">{{item.title}}</router-link>
</li>
</ul>
</div>
<div class="rightContent">
<!-- 显示需要加载的页面 -->
<!-- 二级路由渲染出口 -->
<router-view></router-view>
</div>
</div>
</div>
</template>
<script>
export default {
data(){
return{
menus:[
{id:1,title:'首页',icon:'fa fa-align-justify',path:'/Home'},
{id:2,title:'学生管理',icon:'fa fa-address-card',path:'/Home/student'},
{id:3,title:'班级管理',icon:'fa fa-bank',path:'/Home/classes'},
{id:4,title:'老师管理',icon:'fa fa-user-circle',path:'/Home/teacher'}
],