Vue-admin工作整理(三):路由
1、router-link和router-view组件
router-link组件实际上是封装了一个a标签(链接标签),里面有一个重要属性:“to”,它的值是一个路径,其路径对应的渲染组件,要在路由列表(router->router.js)里定义,该路由列表为一个数组形式存放不同的路由对象,一个基本的路由对象,必须包含两个属性:path、component;path为对应的路径(在url输入的路径),component为对应path路径要渲染的组件
router-view组件是一个视图渲染组件,通过router-link实现跳转的组件,其加载动作都需要通过router-view来渲染
2、路由配置
- 动态路由
通过路由url中传递不同的参数给同一组件,达到呈现不同内容的目的:
- 路由列表中添加一个动态路由定义:
{
path: '/argu/:name',
component: () => import('@/views/argu.vue')
} - Views中增加对应的argu.vue组件:
<template>
<div>
{{ $route.params.name }}
</div>
</template> <script>
export default { }
</script>
<style lang="less" scoped> </style>备注:
{{ $route.params.name }}可以直接获取到路由列表中定义的:name值,$route表示获取当前路由对象
- 路由列表中添加一个动态路由定义:
Run后执行的效果为:
- 嵌套路由
顾名思义组件套组件呈现,实现思路为:路由列表定义一个父组件:parent,然后在父组件下定义子组件:child,强调:在parent.vue中必须要增加视图渲染组件(router-view)才能使子组件渲染出来,具体实现步骤:
- 路由列表增加嵌套关系的组件:
{
path: '/parent',
component: () => import('@/views/parent.vue'),
children: [
{
path: 'child',
component: () => import('@/views/child.vue')
}
]
} - Views中增加对应的parent.vue、child.vue组件:
parent.vue:
<template>
<div>
I am Parent !!!
<router-view/>
</div>
</template>- child.vue:
<template>
<div>
I am Child !!!
</div>
</template>
- 路由列表增加嵌套关系的组件:
Run后执行的效果为:
- 命名路由
通过给路由对象增加name属性,其他组件通过name来读取该对象的方法,比如 home和about路由对象增加name属性:
{
path: '/',
name: 'home',
component: Home
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '@/views/About.vue')
}
然后App.vue中通过修改router-link组件的to方法,由原有的路径访问更改为对象的name属性访问:
<template>
<div id="app">
<div id="nav">
<router-link :to="{ name: 'home' }">Home</router-link>
<router-link :to="{ name: 'about' }">About</router-link>
</div>
<router-view/>
</div>
</template>
备注::to是v-bind:to的缩写两个等同
- 命名视图
如果想在同一个页面上显示多个视图,而且让每一个视图显示指定的位置,实现思路:
- 在App.vue中增加命名视图:
<template>
<div id="app">
<div id="nav">
<router-link :to="{ name: 'home' }">Home</router-link> |
<router-link :to="{ name: 'about' }">About</router-link>
</div>
<router-view/>
<router-view name="email"/>
<router-view name="tel"/>
</div>
</template> - 路由列表中增加命名路由定义【只是由传统的路由对象的component调整为复式的components】,如果1步骤没有命名,则在2步骤中默认的路由对象为default:
{
path: '/name_view',
components: {
default: () => import('@/views/child.vue'),
email: () => import('@/views/email.vue'),
tel: () => import('@/views/tel.vue')
}
} - Views中增加对应的组件
- email.vue:
<template>
<div>
Email: 8130512@qq.com
</div>
</template> - tel.vue:
<template>
<div>
Tel: 18888888888
</div>
</template>
- email.vue:
- 在App.vue中增加命名视图:
Run后的结果呈现:
3、重定向和别名
- 重定向:把当前要访问的url 重定向到另一个url上,实现思路:在路由列表中增加组件对象:
{
path: '/main',
redirect: '/'
}备注:实现的内容就是当访问main这个url的时候,自动重定向到/(首页),也可以通过命名路由的方式来访问
{
path: '/main',
redirect: {
name: 'home'
}
}
也可以通过方法的方式来实现:
{
path: '/main',
redirect: to => {
return {
name: 'home'
}
}
}
2. 别名:我们在访问一个路径的时候,可以给它定义一个其他的名字,效果一样都是访问同一个页面,别名的关键字用的是:alias 用法跟name一样, 注意别名前面要有反斜杠:
{
path: '/',
name: 'home',
alias: '/home_page',
component: Home
}
4、history模式
路由实例中初始化的时候默认是有一个mode方法的,该方法值是hash,就是我们看到的在url中存在的#号字符地址,如果我们想在url中将这种默认的方法剔除掉,可以重新对方法赋值:history,路由实例调整为:
import Vue from 'vue'
import Router from 'vue-router'
import routes from './router' Vue.use(Router) export default new Router({
mode: 'history',
routes
})
然后在路由列表中,增加方法来实现检索不到的地址,则所有非定义的url都跳转到指定组件中去,这里有一个知识点就是路由列表是由上到下来读取的,路由对象间存在读取顺序关系
5、编程式的导航【重点】,通过js来控制页面的跳转、返回等动作
- 返回上一页:思路:通过事件定义,来获取当前路由实例,通过实例调用实例的指定方法:go、back 等
<template>
<div class="home">
<img alt="Vue logo" src="../assets/img/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick">返回上一页</button>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
methods: {
handleClick () {
this.$router.go(-1)
}
}
}
</script>
<template>
<div class="home">
<img alt="Vue logo" src="../assets/img/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick">返回上一页</button>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
methods: {
handleClick () {
this.$router.back()
}
}
}
</script>
也可以通过参数来实现处理,使得逻辑更加缜密:
<template>
<div class="home">
<img alt="Vue logo" src="../assets/img/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick('back')">返回上一页</button>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
methods: {
handleClick (type) {
if (type === 'back') this.$router.back()
}
}
}
</script>
- 通过js来实行指定页面的跳转,思路:通过逻辑判断来使得页面跳转到指定路径,这里要用到的是当前路由实例的push方法,该方法是检索历史路由,然后通过地址直接跳转到指定的路由地址上:
<template>
<div class="home">
<img alt="Vue logo" src="../assets/img/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick('back')">返回上一页</button>
<button @click="handleClick('push')">跳转到Parent页面</button>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
methods: {
handleClick (type) {
if (type === 'back') this.$router.back()
else if (type === 'push') this.$router.push('/parent')
}
}
}
</script>
还可以使用命名的方式跳转到parent上:
<template>
<div class="home">
<img alt="Vue logo" src="../assets/img/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick('back')">返回上一页</button>
<button @click="handleClick('push')">跳转到Parent页面</button>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
methods: {
handleClick (type) {
if (type === 'back') this.$router.back()
else if (type === 'push') {
this.$router.push({
name: 'parent'
})
}
}
}
}
</script>
- 替换到指定页面,比如替换到parent页面,思路:调用当前路由实例的replace方法来替换当前页面
<template>
<div class="home">
<img alt="Vue logo" src="../assets/img/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
<button @click="handleClick('back')">返回上一页</button>
<button @click="handleClick('push')">跳转到Parent页面</button>
<button @click="handleClick('replace')">替换到Parent页面</button>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'home',
components: {
HelloWorld
},
methods: {
handleClick (type) {
if (type === 'back') this.$router.back()
else if (type === 'push') {
this.$router.push({
name: 'parent'
})
} else if (type === 'replace') {
this.$router.replace({
name: 'parent'
})
}
}
}
}
</script>push和replace的区别:push是在浏览历史里加入一个记录,replace是将当前的浏览历史替换为想要替换的页面,之后再做回退,会回退到parent
6、路由组件传参:如果在一个页面中,需要根据路由去获得参数,去对页面进行一些逻辑处理,首先可以通过this.$router来获取路由实例的参数,这样页面组件和路由就进行了耦合,为了进行分离,更大程度复用,我们推出了路由组件传参的实现方案:
- 第一种传参方式为:布尔模式,它适用于有动态路由传参的路由配置中,实现思路为:将路由的参数作为属性来传入到组件中
<template>
<div>
{{ name }}
</div>
</template> <script>
export default {
props: {
name: {
type: String,
default: 'apple'
}
}
}
</script>
<style lang="less" scoped> </style>{
path: '/argu/:name',
component: () => import('@/views/argu.vue'),
props: true
}这样随着不同的url里的参数录入,组件都会展示对应的参数数据
- 第二种传参方式为:对象模式,这种模式适用于普通传统的路由类型,没有参数,实现思路为,直接在组件里定义一个属性,然后路由列表中定义一个路由对象的属性值,默认情况下取的是组件里的默认值,存在各个路由对象下则取对应路由对象的属性值:
<template>
<div class="about">
<h1>This is an about page</h1>
<d>
{{ food }}
</d>
</div>
</template>
<script>
export default {
props: {
food: {
type: String,
default: 'apple'
}
}
}
</script>
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '@/views/About.vue'),
props: {
food: 'banana'
}
}
- 第三种传参方式为:函数模式,适合于在传入的属性中,能够根据当前的路由,来做一些处理逻辑,从而设置传入组件的属性值,就是如果URL+参数,实现传递不同的内容给组件,实现逻辑:路由列表中以函数方式同等属性名(food)来获取当前路由实例的指定属性的值:route.query.food,然后组件中定义同名属性以承接路由列表传递的属性值,然后供业务逻辑处理呈现
{
path: '/',
name: 'home',
alias: '/home_page',
component: Home,
props: route => ({
food: route.query.food
})
}
props: {
food: {
type: String,
default: 'apple'
}
}
Vue-admin工作整理(三):路由的更多相关文章
- Vue学习日记(三)——Vue路由管理vue-router
前言 为了给读者更好的体验,去理解vue-router和下一篇介绍vuex,决定还是来一个实战教程来带大家更加的去深入理解vue-router,在这之前,读者先自行了解和去官网下载npm和node,附 ...
- Vue-admin工作整理(二):项目结构个人配置
通过上一篇文章(Vue-admin工作整理(一):项目搭建)操作完毕后,基础项目已经搭建,下面就要对项目本身进行一下项目结构调整来符合自己的项目要求 1.首先要对package.json文件进行调整, ...
- Win10无法连接远程桌面提示“你的凭据不工作”的三个解决方法
Win10无法连接远程桌面提示"你的凭据不工作"的三个解决方法(转藏) 解决方法一:修改组策略 1.在"开始"窗口运行gpedit.msc,进入计算机配置-&g ...
- vue+webpack开发(三)
上一篇博文讲了怎么使用路由,这次主要讲讲怎么编写一个vue组件 vue定义了一种“单文件组件”后缀为‘.vue’的文件,大概长这样子: <template> <div> < ...
- php开发面试题---jquery和vue对比(整理)
php开发面试题---jquery和vue对比(整理) 一.总结 一句话总结: jquery的本质是更方便的选取和操作DOM对象,vue的本质是数据和页面分离 反思的回顾非常有用,因为决定了我的方向和 ...
- vue项目创建步骤 和 路由router知识点
菜单快捷导航: vue项目创建 vue路由router知识点(路径参数.查询参数.命名路由.嵌套路由.命名视图.hash/history模式) 1.创建一个vue项目步骤 (windows环境下).创 ...
- Vue系列教程(三)之vue-cli脚手架的使用
一.Vue-cli的环境准备 目的:(1)快速管理依赖 (2)确定项目结构 1.安装node.js Node.js是一个可以让前端运行在服务器上的一个工. 下载:https://nodejs.org/ ...
- vue mandmobile ui实现三列列表的方法
vue mandmobile ui实现三列列表的方法 请问这种列表的要用那个组件好呢?Cellitem 只能用到两列,这个要三列的怎么弄?mand的好像没有listview,grid组件的 问了man ...
- Vue Admin - 基于 Vue & Bulma 后台管理面板
Vue Admin 是一个基于 Vue 2.0 & Bulma 0.3 的后台管理面板(管理系统),相当于是 Vue 版本的 Bootstrap 管理系统,提供了一组通用的后台界面 UI 和组 ...
- 15:element/Vue Admin
1.1 简介 1.Vue Admin 简介 1. Vue Admin 是一个基于 Vue 2.0 & Bulma 0.3 的后台管理面板(管理系统),相当于是 Vue 版本的 Bootstra ...
随机推荐
- jQuery toastr提示简单实现
注:在学校平时做的小项目跳页都是用 Response.Write写脚本弹窗并跳页,每次点击登录成功,注册成功......然后点击确定,太麻烦了,这次的项目老师说让用这个插件,所以就简单搞了一下! 实现 ...
- python 小试一题
a = 66count = 1while count <=3 : b = int(input("猜测这个数字:")) if b < a: print("猜测的 ...
- (转) jmeter 获取cookie
转自 https://blog.csdn.net/five3/article/details/53842283 jmeter是测试过程中会被用到的一个测试工具,我们即可用来进行压力的压测,也可以用 ...
- 白话skynet第一篇
当你走过一个坐在自己店门前的杂货商面前.走过一个吸着烟斗的守门人面前,走过一个马车夫面前时,请你给我描绘一下这个杂货商.守门人和马车夫,他们的姿态,他们的外貌,要用画家那样的细节描绘出他们的精神本质, ...
- [USACO11DEC]牧草种植Grass Planting
图很丑.明显的树链剖分,需要的操作只有区间修改和区间查询.不过这里是边权,我们怎么把它转成点权呢?对于E(u,v),我们选其深度大的节点,把边权扔给它.因为这是树,所以每个点只有一个父亲,所以每个边权 ...
- python打包
打包生成一个可执行文件(非窗口程序的) pyinstall -F example.py
- ORACLE中 大量数据插入表 SQL
declare g_commit_count number; cursor cu1 is select gl_flexfields_pkg.get_description_sql(gcc.chart_ ...
- react中对于redux的封装
const createStore = (reducer)=>{ //默认的state对象 let state = {}; //将所有订阅的事件存在在这个数组中 let listeners = ...
- 4.JAVA基础复习——JAVA中的构造函数与this关键字
构造函数:构建创造对象时调用的函数 特点: 1.函数名与类名相同. 2.不用定义返回值类型. 3.没有具体的返回值. public class Demo { private int age; priv ...
- 2019/4/16 wen 反射与JVM