在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
vue router1、认识路由的概念1.1、何为路由通过互联的网络把信息从源地址传输到目的地址的活动. 1.2、后端路由阶段早期的网站开发整个HTML页面是由服务器来渲染的. 1.3、前端路由阶段前后端分离阶段: 1.4、前端渲染和后端渲染?前端渲染:服务器直接生产渲染好对应的HTML页面, 返回给客户端进行展示。比如:jsp页面 后端渲染:后端返回JSON数据,前端利用预先写的html模板,循环读取JSON数据,拼接字符串,并插入页面。 2、前端路由的规则2.1、URL的hash 方式location说明 location.href效果 页面整个刷新 location.hash 局部刷新 而非全部刷新 2.2、HTML5的history模式
特点:先进后出 pushState:入栈 back:出栈 效果如下
不能回退
3、route-view的基础3.1 认识vue-router
3.2、安装和使用vue-router
导入路由对象,并且调用Vue.use(VueRouter) 创建路由实例,并且传入路由映射配置 在vue实例中挂载创建的路由实例
创建路由组件 配置路由映射,组件和路径映射关系
<template> <div> <h2>我是关于</h2> <p>我是关于内容, 呵呵呵</p> </div> </template> <script> export default { name: "About" } </script> <style scoped> </style>
<template> <div> <h2>我是首页</h2> <p>我是首页内容, 哈哈哈</p> </div> </template> <script> export default { name: "Home" } </script> <style scoped> </style>
// 创建VueRouter对象 const routes = [ { path: '', <!--路由的默认值--> // 页面默认加载 直接访问主页 redirect: '/home' }, { path: '/home', component: Home }, { path: '/about', component: About }, ] const router = new VueRouter({ // 配置路由和组件之间的应用关系 routes, mode:"history", linkActiveClass:"active" })
<template> <div id="app"> <router-link to="/home">首页</router-link> <router-link to="about">About</router-link> <router-view/> </div> </template> 大致流程
2、删除默认生成的HelloWorld组件相关信息
<template> <div> 我是首页内容 </div> </template>
import VueRouter from 'vue-router' import Vue from 'vue' import Home from '../components/Home' // 1、通过Vue.use(插件名) 安装插件 Vue.use(VueRouter) // 2、创建VueRouter对象 const routes = [ { path: '/home', component: Home } ] // 3、配置路由和组件之间映射关系 const router = new VueRouter({ routes }) // 4、将router对象传入Vue实例 export default router
<template> <div id="app"> <!-- 渲染超链接 a --> <router-link to="/home" tag="button">主页</router-link> <router-link to="/about" tag="button">关于</router-link> <!-- 动态渲染组件 --> <router-view></router-view> </div> </template> <script> export default { name: "App", components: {}, }; </script> <style> </style> 简要说明组件 <router-link>:该标签是一个vue-router已经内置的组件,最终会被渲染一个a链接 <router-view>:该标签会根据当前路径,动态渲染出不同组件 网页的其他内容,比如顶部的标题导航,或者说 底部的一些版权信息和<router-view>处于同一登记 路由切换时候,切换就是<router-view>挂载的组件,其他内容不改变 最终效果图 3.3、路由的默认路径
配置解析
3.4、HTML5的history模式页面默认是 url的hash模式 想要改成html5中history,可以进行一下配置 修改后 3.5、router-link补充
也可以通过这种方式 在路由配置的index.js 3.6、路由代码跳转源码实现 <template> <div id="app"> <!-- 渲染超链接 a --> <!-- <router-link to="/home" tag="h1" replace>主页</router-link> --> <!-- <router-link to="/about" tag="h1" replace active-class>关于</router-link> --> <button @click="handleHome">主页</button> <button @click="handleAbout">关于</button> <!-- 动态渲染组件 --> <router-view></router-view> </div> </template> <script> export default { name: "App", components: {}, methods:{ handleHome(){ this.$router.push('/home') }, handleAbout(){ this.$router.push('/about') } } }; </script> <style></style> 效果图 3.7、动态路由在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径: 1、配置组件和路径的映射关系 // 配置路由相关的信息 import Vue from 'vue' import VueRouter from "vue-router" import Home from '../components/Home' import About from '../components/About' import User from '../components/User' // 通过Vue.use(插件),安装插件 Vue.use(VueRouter) // 创建VueRouter对象 const routes = [ { path: '', redirect: '/home' }, { path: '/home', component: Home }, { path: '/about', component: About }, <!--这是关键代码--> { path: '/user/:id', component: User }, ] const router = new VueRouter({ // 配置路由和组件之间的应用关系 routes, mode: "history", linkActiveClass: "active" }) // 将router对象传入Vue实例 export default router 2、创建组件User User.vue <template> <div> <h1>我是APP页面</h1> {{$route.params.id}} </div> </template> 3、首页显示 <router-link to="/home/极客鼠" >测试获取用户名</router-link><br> 4、效果图 4、路由的懒加载4.1、认识懒加载官方给出了解释: 4.2、懒加载效果// 配置路由相关的信息 import Vue from 'vue' import VueRouter from "vue-router" const Home = () => import ('../components/Home') const About = () => import ('../components/About') const User = () => import ('../components/User') // 通过Vue.use(插件),安装插件 Vue.use(VueRouter) // 创建VueRouter对象 const routes = [ { path: '', redirect: '/home' }, { path: '/home', component: Home }, { path: '/about', component: About }, { path: '/user/:id', component: User }, ] const router = new VueRouter({ // 配置路由和组件之间的应用关系 routes, mode: "history", linkActiveClass: "active" }) // 将router对象传入Vue实例 export default router 4.3、懒加载方式5、路由的嵌套使用5.1、认识嵌套路由嵌套路由是一个很常见的功能 组件和路径关系 5.2、实现过程1、创建两个组件Message,News
<template> <div id="about">最新消息</div> </template> <script> </script>
<template> <div id="about">新闻内容</div> </template> <script> </script> 2、配置路由信息 主要是子路由 import Vue from 'vue' import VueRouter from 'vue-router' const Home = () => import('../components/Home') const About = () => import('../components/About') const Message = () => import('../components/Message') const News = () => import('../components/News') // 1、通过Vue.use(插件名) 安装插件 Vue.use(VueRouter); // 2、创建VueRouter对象 const routes = [ { path:'/home', component:Home, children:[ { path:'news', component: News }, { path:'message', component: Message } ] }, { path: '/home/:username', component: Home }, { path: '/about', component: About } ] // 3、配置路由和组件之间映射关系 const router = new VueRouter({ routes, mode: 'history', // linkActiveClass: 'active' }) // 4、将router对象传入Vue实例 export default router
3、父组件渲染子组件信息
<template> <div id="home"> 我是首页内容<br> <router-link to="/home/news"> 新闻</router-link> <router-link to="/home/message"> 消息</router-link> <router-view></router-view> <!-- <h2>用户名:{{ $route.params.username }}</h2> --> </div> </template> <script> export default { name: "Home", }; </script> 4、效果图 5.3、嵌套路由的默认路径重定向redirect { path: '/user', component: User, children: [ { path: 'message', component: Message, }, { path: 'news', component: News, }, // 重定向 /user/news { path: '', redirect: 'news', }, ] }, 6、路由传递参数传递参数主要有两种类型:params和query 1.配置路由格式:/router/:id 2.传递的方式:在path后面跟上对应的值 3.传递后形成的路径:/router/123,/router/abc query类型 1.配置路由格式:/router,也就是普通配置 2.传递方式:对象中使用query的key作为传递方式 3.传递后形成的路径:/router?id=123,/router?id=abc 6.1、准备工作
1、创建组件Profile.vue <template> <div> <h2>我是Profile页面</h2> <p>我是profile页面具体内容</p> <!--获取字符串入参 譬如:/profile/123--> <p>$route.params:{{ $route.params }}</p> <!--获取对象类型入参 譬如: /profile?name=1&age=10--> <p>$route.query:{{ $route.query }}</p> </div> </template> <script> export default { name: "Profile", }; </script> <style scoped> </style> 2、配置路由 const Profile = () => import('../components/Profile') { path: '/profile/:id', component: Profile } 3、app.vue 页面显示 <router-link :to="{ path: '/profile/' + 123, query: { name: 'geekmice', hobby: '篮球' } }" tag="button" >router-link传递参数</router-link > 4、最终效果
<button @click="jsTransferParams">js传递参数</button> jsTransferParams() { this.$router.push({ path: "/profile/" + 666, query: { name: "geekmice", hobby: "探索黑科技" }, }); }, profile.vue获取参数 <p>$route.params:{{ $route.params }}</p> <p>$route.query:{{ $route.query }}</p> 6.2、获取参数获取参数通过$route对象获取的. 在使用了vue-router应用中,路由对象会被注入每个组件中,赋值为this.$route,并且路由切换时候,路由对象会被更新。 6.3、router和route区别简单理解 即一个获取路由信息,一个是用来操作路由的; $router为VueRouter实例,想要导航到不同URL,则使用$router.push方法 $route为当前router跳转对象里面可以获取name、meta、path、hash、query、params、fullPath、matched、redirectedFrom等 7、路由导航守卫vue-router提供的导航守卫主要用来监听路由的进入和离开的
// 配置路由相关的信息 import Vue from 'vue' import VueRouter from "vue-router" const Home = () => import('../components/Home') const About = () => import('../components/About') const User = () => import('../components/User') const Message = () => import('../components/Message') const News = () => import('../components/News') const Profile = () => import('../components/Profile') // 通过Vue.use(插件),安装插件 Vue.use(VueRouter) // 创建VueRouter对象 const routes = [ { path: '', redirect: '/home' }, { path: '/home', component: Home, meta: { title: "首页" } }, { path: '/profile/:id', component: Profile, meta: { title: "档案" } }, { path: '/about', component: About, meta: { title: "关于" } }, { path: '/user', component: User, children: [ { path: 'message', component: Message, }, { path: 'news', component: News, }, { path: '', redirect: 'news', }, ] }, ] const router = new VueRouter({ // 配置路由和组件之间的应用关系 routes, mode: "history", linkActiveClass: "active" }) router.afterEach((to, from, next) => { document.title = to.matched[0].meta.title; next() }) // 将router对象传入Vue实例 export default router 效果图 简要说明
8、keep-alive这个组件 Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。
源码实现 <template> <div> <h1>开始页面</h1> <input type="text" placeholder="请输入。。。"> </div> </template> 2、KeepEnd.vue <template> <div> <h1>不需要缓存页面</h1> <input type="text" placeholder="请输入"> </div> </template> 3、router->index.js const KeepStart = () => import('../components/KeepStart') const KeepEnd = () => import('../components/KeepEnd') { path: '/keepStart', component: KeepStart, name:'keepStart', meta: { keepAlive: true } }, { path: '/keepEnd', name:'keepEnd', component: KeepEnd, meta: { keepAlive: false } } 4、App.vue <router-link to="/keepStart" tag="button">keepstart页面</router-link> <router-link to="/keepEnd" tag="button">keepend页面</router-link> <!-- 动态渲染组件 --> <!-- <router-view></router-view> --> <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view> 效果图 9、TabBar练习9.1、需求表述效果图
表述 9.2、需求分析
自定义TabBar组件,在APP中使用 让Tabbar处于底部,设置相关的样式
定义插槽 flex布局评分TabBar
定义TabBarItem,并且定义两个插槽:图片,文字 给两个插槽外层包装div,用于设置样式 填充插槽,实现底部TabBar的效果
定义另外一个插槽,插入active-icon的数据 定义个变量isActive,通过v-show来决定是否显示对应的icon
安装路由 npm install vue-router --save 完成router->index.js,创建对应的组件 main.js注册router App.vue加入router-view组件 渲染
监听item的点击,通过this.$router.replace()替换路由路径 通过this.$route.path.indexOf(this.link) !== -1 来判断是否是active
封装新的计算属性 this.isActive ? {‘color':‘red'}:{} 9.3、需求实现实现版本1
vue create navbar
<template> <div id="app"> <div id="tab-bar"> <div id="tab-bar-item">首页</div> <div id="tab-bar-item">分类</div> <div id="tab-bar-item">购物车</div> <div id="tab-bar-item">我的</div> </div> </div> </template> <script> export default { name: "App", components: {}, }; </script> <style> /* 引入css样式 */ @import url("./assets/css/base.css"); #tab-bar { display: flex; background-color: rgb(246, 246, 246); /* 绝对定位 */ position: fixed; left: 0; bottom: 0; right: 0; } #tab-bar-item { flex: 1; text-align: center; height: 49px; } </style>
body{ padding: 0; margin: 0; }
最终版本
关键源码实现
<template> <div id="tab-bar"> <slot></slot> </div> </template> <script> export default { name: "TabBar" } </script> <style scoped> #tab-bar { display: flex; background-color: #f6f6f6; position: fixed; left: 0; right: 0; bottom: 0; box-shadow: 0 -1px 1px rgba(100,100,100,.2); } </style>
<template> <!--所有的item都展示同一个图片, 同一个文字--> <div class="tab-bar-item" @click="itemClick"> <div v-if="!isActive"><slot name="item-icon"></slot></div> <div v-else><slot name="item-icon-active"></slot></div> <div :style="activeStyle"><slot name="item-text"></slot></div> </div> </template> <script> export default { name: "TabBarItem", props: { path: String, activeColor: { type: String, default: 'red' } }, data() { return { // isActive: true } }, computed: { isActive() { // /home -> item1(/home) = true // /home -> item1(/category) = false // /home -> item1(/cart) = true // /home -> item1(/profile) = true return this.$route.path.indexOf(this.path) !== -1 }, activeStyle() { return this.isActive ? {color: this.activeColor} : {} } }, methods: { itemClick() { this.$router.replace(this.path) } } } </script> <style scoped> .tab-bar-item { flex: 1; text-align: center; height: 49px; font-size: 14px; } .tab-bar-item img { width: 24px; height: 24px; margin-top: 3px; vertical-align: middle; margin-bottom: 2px; } </style>
import Vue from 'vue' import VueRouter from 'vue-router' const Home = () => import('../views/home/Home') const Category = () => import('../views/category/Category') const Cart = () => import('../views/cart/Cart') const Profile = () => import('../views/profile/Profile') // 1.安装插件 Vue.use(VueRouter) // 2.创建路由对象 const routes = [ { path: '', redirect: '/home' }, { path: '/home', component: Home }, { path: '/category', component: Category }, { path: '/cart', component: Cart }, { path: '/profile', component: Profile } ] const router = new VueRouter({ routes, mode: 'history' }) // 3.导出router export default router 最终效果 到此这篇关于详解VueRouter 路由的文章就介绍到这了,更多相关VueRouter 路由内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论