首先你要在src目录下新建一个文件夹来放你接下来要建的Vue文件如图:
建立好文件夹和文件夹内的vue文件后,他会自动生成内置的一些代码(这都不重要)
接下来就是要配置路由router,也就是配置index.js文件
配置index.js文件
首先你要引入你的文件
import Privacy from ‘@/pages/account/Privacy’
前面是你的文件名,后面是你的路径, @ 相当于 ..
这些弄完后再开始配置routes
(不要看那个https什么的,那是传图片出现的错误)
path是路径,只要一个“/”默认是主页路径,component是你的组建名,一般和文件名同名,name和你新建的Vue页面定义的name一致,一般都和文件名一致建立完后运行即可。
想进入你刚刚定义的页面,如果没有定义跳转路由的话直接去页面改变路径,如我的:
即可看到你定义的页面。
注意:用import引入的话,当项目打包时路由里的所有component都会打包在一个js中,造成进入首页时,需要加载的内容过多,时间相对比较长。所以我们一般用require这种方式引入。它会将你的component分别打包成不同的js,加载的时候也是按需加载,只用访问这个路由网址时才会加载这个js。
meta里面写一些页面描述
如:
{
path: ‘/Privacy’,
// name: ‘Privacy’,
component: resolve => require([‘@/pages/account/Privacy’],resolve),
meta:{
title:’关于我们’
}
这种写法,和上图的写法一样的,写完后可以将 import Privacy from ‘@/pages/account/Privacy’ 这段代码删除,比较简便。
如果你先定义路由后,在这个路由里面继续定义子路由,来实现一个点击标签页面内某些部分内容发生变化。则需定义嵌套的子路由
实现在你新建的页面(我这里是Privacy页面)写一个div来放<router-view/>,这就是你子路由要显示的地方。如:
<div> <router-view/> </div>
注意:一个页面的template中只能有一个div,即不能写成这样
<template>
<div>
</div>
<div>
</div>
</template>
这会报错,只能这么写
<template>
<div>
<div>
</div>
<div>
<router-view/>
</div>
</div>
</template>
弄完后建立你的嵌套子路由页面
黄色是我为嵌套子路由页面写的一个文件夹,把它们都放进去,红色括起来的4个是我的子路由页面。
接下来开始配置路由
还是在router目录下的index.js文件中
routes: [
{
path: ‘/’,
name: ‘HelloWorld’,
component: HelloWorld
},
{
path: ‘/Privacy’,
// name: ‘Privacy’,
component: resolve => require([‘@/pages/account/Privacy’],resolve),
meta:{
title:’关于我们’
},
children:[
{
path: ‘Introduction’,
name: ‘Introduction’,
component: resolve => require([‘@/pages/account/dialog/Introduction’],resolve),
meta:{
title:’公司简介’
}
}
]
}
在meta后面写子路由children,一定要注意children要在它父级路由配置的花括号里面!
子路由的path可以不加“/”号直接写成path: ‘Introduction’。当然也可以加。
弄完后别忘记在父级页面,我这里是Privacy页面写个跳转标签。(一般点击跳转会有判断什么的,所以用个函数包起来)
<li :class="{'Privacy_box_active': m4}" @click="goTo">
methods:{
goTo:function() {
this.$router.push({name: ‘Introduction’})
}
}
这样就写好了,下面贴一下我的完整代码
<!--父级页面Privacy.vue-->
<template>
<div class="Privacy_box">
<span class="left_span">关于我们</span>
<ul class="pb10">
<li :class="{'Privacy_box_active': m1}" @click="goTo('m1')">
<span>公司简介</span>
</li>
<li :class="{'Privacy_box_active': m2}" @click="goTo('m2')">
<span>隐私政策</span>
</li>
<li :class="{'Privacy_box_active': m3}" @click="goTo('m3')">
<span>注册协议</span>
</li>
<li :class="{'Privacy_box_active': m4}" @click="goTo('m4')">
<span>联系我们</span>
</li>
</ul>
<div class="bh-account_router">
<router-view/>
</div>
</div>
</template>
<script>
export default {
name: 'Privacy',
data () {
return {
m1:true,
m2: false,
m3: false,
m4: false
}
},
created() {
alert("开始第一次调用")
this.refresh()
},
mounted(){
alert("开始第二次调用")
this.refresh()
},
methods:{
goTo (menu) {
this.m1 = false
this.m2 = false
this.m3 = false
this.m4 = false
this[menu] = true
switch (menu) {
case 'm1':
this.$router.push({name: 'Introduction'})
break
case 'm2':
this.$router.push({name:'trueprivacy'})
break
case 'm3':
this.$router.push({name:'registered'})
break
case 'm4':
this.$router.push({name:'contact'})
break
default:
this.$router.push({name:'App'})
}
},
refresh(){
const meta = (this.$route.path).split("/")
this.m1 = false
this.m2 = false
this.m3 = false
this.m4 = false
switch (meta[2]) {
case 'Introduction':
this.m1=true
break
case 'trueprivacy':
this.m2=true
break
case 'registered':
this.m3=true
break
case 'contact':
this.m4=true
break
default:
break
}
}
}
}
</script>
<style scoped>
.Privacy_box{
width: 1360px;
min-height: 555px;
margin: 33px auto 90px auto;
background-color: #FFF;
position: relative;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: all 200ms;
-moz-transition: all 200ms;
-ms-transition: all 200ms;
-o-transition: all 200ms;
transition: all 200ms;
}
.left_span{
font-family:PingFangSC-Regular;
font-size:14px;
color:#999999;
letter-spacing:0.39px;
text-align:left;
display: block;
position: absolute;
left: 75px;
top: 15px;
}
/*菜单*/
.Privacy_box ul {
display: inline-block;
list-style:none;
width: 230px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
vertical-align: top;
padding-top: 36px;
padding-left: 43px;
}
/*鼠标滑过*/
.Privacy_box li {
min-height: 45px;
max-height: 70px;
line-height: 45px;
text-align: left;
width: 190px;
cursor: pointer;
border-left: 2px solid transparent;
}
.Privacy_box li span{
font-family:PingFangSC-Regular;
font-size:16px;
color:#666666;
letter-spacing:0.45px;
margin-left: 48px;
}
.Privacy_box li:hover {
background-color: #f0f4ff;
}
/*被选中*/
.Privacy_box .Privacy_box_active {
background-color: #f0f4ff;
border-left: 2px solid #0BB2FE;
}
/*路由*/
.bh-account_router {
display: inline-block;
width: 969px;
vertical-align: top;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border-left: 1px solid #e6e6e6;
}
</style>
路由index.js:
import Vue from ‘vue’
import Router from ‘vue-router’
import HelloWorld from ‘@/components/HelloWorld’
Vue.use(Router)
export default new Router({
routes: [
{
path: ‘/’,
name: ‘HelloWorld’,
component: HelloWorld
},
{
path: ‘/Privacy’,
// name: ‘Privacy’,
component: resolve => require([‘@/pages/account/Privacy’],resolve),
meta:{
title:’关于我们’
},
children:[
{
path: ‘Introduction’,
name: ‘Introduction’,
component: resolve => require([‘@/pages/account/dialog/Introduction’],resolve),
meta:{
title:’公司简介’,
group: ‘Dialog’
}
},
{
path: ‘trueprivacy’,
name: ‘trueprivacy’,
component: resolve => require([‘@/pages/account/dialog/trueprivacy’],resolve),
meta:{
title:’隐私政策’,
group: ‘Dialog’
}
},
{
path: ‘registered’,
name: ‘registered’,
component: resolve => require([‘@/pages/account/dialog/registered’],resolve),
meta:{
title:’注册协议’,
group: ‘Dialog’
}
},
{
path: ‘contact’,
name: ‘contact’,
component: resolve => require([‘@/pages/account/dialog/contact’],resolve),
meta:{
title:’联系我们’,
group: ‘Dialog’
}
}
]
}
]
})
完整目录:
嵌套子页面什么样我就不写了,你建立了子页面在他们的template下加个div就能运行。