本章节我们将为大家介绍 Vue.js 路由。
Vue.js 路由允许我们通过不同的 URL 访问不同的内容。
通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)。
Vue.js 路由需要载入 vue-router 库
中文文档地址:vue-router文档。
https://unpkg.com/vue-router/dist/vue-router.js
推荐使用淘宝镜像:
cnpm install vue-router //会默认安装在node_modules文件中
//cnpm install -g vue-router //会安装在全局目录中(类似python的虚拟环境和全局环境)
1、将example里的。。。粘贴到src/router/index.js里
路由的创建站们放到单独的文件里components/router/index.js
// track number of popstate listeners
import Vue from 'vue'
import VueRouter from 'vue-router'
// 1. Use plugin.
// This installs and ,
// and injects $router and $route to all router-enabled child components
Vue.use(VueRouter)
// 2. Define route components 在src/router/index.js中导入子组件
import greeting from "../components/greeting";
import projectlist from "../components/projectlist";
import projectlistNew from "../components/projectlistNew";
import login from "../components/login";
import loginNew from "../components/loginNew";
import HelloWorld from "@/components/HelloWorld";
// 3. Create the router 在src/router/index.js中创建路由:一个routers数组中的一个对象,就是一条路由
const router = new VueRouter({
mode: 'history',
routes: [
{ path: '/', component: HelloWorld,name:'hello-world'},
{ path: '/projectlist1', component: projectlist,name:'projectlist1' },
{ path: '/projectlist2', component: projectlistNew,name:'projectlist2' },
{ path: '/login1', component: login,name:'login1' },
{ path: '/login2', component: loginNew,name:'login2' },
{ path: '/greeting', component: greeting,name:'greeting' }
]
});
// 4、导出路由
export default router;
main.js文件:
//导入vue.js
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
//导入App.vue根组件
import App from './App.vue'
//5.1、导入vue router对象
import router from './router/index'
import loginNew from "@/components/loginNew";
//创建全局组件
Vue.component('login-New',loginNew);
//在导入Vue实例之前,要将element-ui插件加入到Vue中
Vue.use(ElementUI);
Vue.config.productionTip = false
new Vue({
//5.2、把router挂载到Vue实例中去
router,
render: h => h(App),//渲染App根组件
}).$mount('#app')
App.vue文件
不足:我们需要手动的修改路径才能跳转到不同页面
-
菜单一HelloWorld
-
菜单二projectlist
-
菜单三projectlistNew
-
菜单四login
-
菜单五loginNew
-
菜单六greeting
-
菜单七xibo_index
- 在App.vue的标签内中
展示路由的页面内容
- 不足:必须要手动改变路由才能跳转到不同页面
- 优化:在父组件的标签内使用
可以达到点击标签就可以跳转页面
- to属性默认为path路径值,
- 不足:如果一个地方改变,就要修改2个地方路径
- 优化:可以在path中添加name属性,然后在父组件中:to="{name:name_value"}
在index.js文件中,
{
path: '/login1',
component: login,
name: 'login1',
children: [
// an empty path will be treated as the default, e.g.
// components rendered at /parent: Root -> Parent -> Default
// {path: '', component: login, name: 'login1'},
//如果加/,则会从根路由开始匹配,http://localhost:8081/login2
{path: '/login2', component: loginNew, name: 'login2'},
//如果不加/,则会自动拼接到父路由后面,http://localhost:8081/login1/login2
{path: 'login2', component: loginNew, name: 'login2'},
methods:{
//方法一:
// changeusername:function (){
// this.username="dalao"
// },
//方法二:推荐使用
changeusername(){
this.username="一个没有整容需求的人"
}
},
created() {
console.log("实例创建之后,能够获取到this");
console.log("username为:",this.username);
this.username=this.$route.query.name;
this.age=this.$route.query.age;
查询路径参数,this.$route.params.username
路由文件index.js
const router = new VueRouter({
mode: 'history',
routes: [
{ path: '/', component: HelloWorld,name:'hello-world'},
{ path: '/projectlist1', component: projectlist,name:'projectlist1' },
{ path: '/projectlist2', component: projectlistNew,name:'projectlist2' },
{ path: '/login1', component: login,name:'login1' },
{ path: '/login2', component: loginNew,name:'login2' },
//路径参数:在url上(在ptah中路径+":参数")
{ path: '/greeting/:username', component: greeting,name:'greeting' }
]
子组件 greeting.vue
created() {
console.log("实例创建之后,能够获取到this");
console.log("username为:",this.username);
this.username=this.$route.query.name;
this.age=this.$route.query.age;
this.username=this.$route.params.username;
// this.age=this.$route.params.age;
},
在template里参数写成{{this.$route.params.username}}
username为:{{this.$route.params.username}}
然后在created()就不用写this.username=this.$route.params.username
created() {
//获取路径参数
// this.username=this.$route.params.username;
}
jquery传参和params传参的区别
1、用法上:
上文已经提到query可以用name或path来引入
params必需要用name来引入,接收参数都是类似的,分别是:
this.$route.query.name和
2、地址栏表现形式上:
query:
/login?id=10&name=zs
params:
/login/12/ls
注意:
这里的12和ls对应的是/:id/:name;
这两个参数可以不写,那么就不会再地址栏上显示;
不过刷新页面,参数会消失;
写上参数刷新页面,参数不会消失。
传参:
this.$router.push({
path:'/detail/:id',
query:{
id:id
}
})
接收参数:
this.$route.query.id
传参:
this.$router.push({
name:'Detail',
params:{
id:id
}
})
接收参数:
this.$route.params.id
Tips:
params传参,push里面只能是 name:‘xxxx’,不能是path:’/xxx’,因为params只能用name来引入路由,如果这里写成了path,接收参数页面会是undefined!!!
// query通过path切换路由
前往Detail页面
// params通过name切换路由
前往Detail页面
简单说query相当于get请求,页面跳转的时候,可以在地址栏看到请求参数,浏览器刷新页面不会消失,而params相当于post请求,参数不会在地址栏中显示,浏览器刷新页面后消失。