标签:push advance 相同 动态改变 文件 字符串 阶段 异步 r文件
后端路由
由后端服务器html+css+java动态绑定数据并渲染好一个页面,直接发送到前端。
优点是有利于seo优化,缺点html和数据逻辑混在一起,难以维护
前后端分离
随着Ajax出现,后端只负责数据,前端去静态服务器请求html+css+js,然后调用api接口再进行数据处理进行渲染
URL的hash也就是锚点(#), 本质上是改变window.location的href属性.
location.hash = 'aaa'
1. pushState
把url push进去,类似栈结构,遵循先入后出
history.pushState({},'','home')
2. back
返回前一页面
history.back()
3. forward
前进下一页面
history.forward()
4. replaceState
替换url,不会保留历史记录
history.replaceState({},'','home')
5. go
history.go指跳转到指定页面
history.go(-1) 等同于 history.back()
history.go(1) 等同于 history.forward()
安装vue-router,也可以通过脚手架安装
npm install vue-router --save
通过<router-link>的属性to指定路由路径
<router-view>指定展示位置
让路径默认跳转到首页,多配置一个映射即可
使用redirect重定向路由路径
{
path:'/',
redirect:'home'
}
之前在前端路由规则中讲过有两种模式。
除了使用<router-link>标签中to的跳转方式,我们还可以使用$router方法来控制url
changeHome(){
//push URL方法
//this.$router.push('/home')
//replace URL方法
this.$router.replace('/home')
}
注意:使用函数方法push相同的路径会报错,解决思路,使用if判断,push路径等于当前路径则什么都不做,不等于才push进去路由
if(this.$route.path != this.path){
this.$router.push(this.path)
}
需求1:在我们配置路由path的时候可能需要后面加一个用户id,而id又是动态改变的,
所以我们需要配置一个动态路由
<!--
<router-link to="/user/vicer">用户</router-link> -->
<router-link v-bind:to="'/user/'+useId">用户</router-link>
data(){
return{
useId:'vicer'
}
}
需求2:我们希望id能够展示到页面上
$route获取当前被选中的路由
params是参数
id是映射关系path中动态指定的地址
//id可以随意命名,只要和path中对应即可
<h3>{{$route.params.Id}}</h3>
也可以通过计算属性return出去,记得加this
当我们打包js时文件太大,用户请求页面会导致加载时间过长,甚至出现页面空白。
路由懒加载可以在打包时把对应组件打包成一个个js代码块,当路由被访问到时,才加载对应组件
懒加载方式:
如果想在子路由中设置默认路径,直接在children中设置重定向,方法一样
协议://主机:端口/路径?查询#片段
scheme://host:port/path?query#fragment
当传递数据较多的话,使用query类型
1. params的类型:
{{$route.params}}
2. query的类型:
{{$route.query}}
源码大概了解即可,看不懂把上面的记住
源码解读:所有的组件都继承自vue的原型
Vue.prototype.test = function(){
console.log('test')
}
意为着我们在所有vue方法中都可以调用
this.test()
而Object.defineProperty(目标对象,被添加的key,被添加的value)
可以往对象中添加属性
Object.defineProperty(Vue.prototype,'$router',{
get(){return this._routerRoot._route
})
等同于
Vue.prototype.$route = get(){return this._routerRoot._route}
所以我们的$router和$route也是继承自vue原型.
而且源码中还注册了两个全局组件
Vue.component('RouterLink',Link)
Vue.component('RouterVier',View)
所以我们可以大胆的使用这些组件了。
导航守卫主要用来监听路由的进入和离开,
vue-router提供了beforeEach和afterEach的钩子函数
from:导航要离开的路由
to:即将要进入的路由
next:跳转到下一个钩子
//1. 在路由映射中添加meta元数据
{
path:'/home',
component:Home,
meta:{
title:'主页'
}
}
//2. 在router配置文件中写导航守卫。前置钩子
router.beforeEach((to,from,next) => {
console.log(to);
document.title = to.matched[0].meta.title
//next()必须调用,否则无法跳转
next();
})
注意:
当<keep-alive>包含<router-view>时,所有路径匹配到的视图组件都会被缓存
当组件被缓存时,切换组件就不会重复进行创建(created)和销毁(destroyed),组件会处于活跃(activate)或非活跃(dedestroyed)状态
而activated和deactivated是keep-alive的生命周期钩子函数,只有当使用keep-alive时才能使用这两个函数
keep-alive属性
需求:当我们切换路由再返回时,希望保存原来的子路由位置,并进行返回
使用计算属性判断路径是否相同
computed:{
isActive(){
return true
//下面的举例,只是为了抛砖引玉,indexOf !== -1则代表相同,返回true
//return this.$route.path.indexOf(this.path) !== -1;
}
}
标签:push advance 相同 动态改变 文件 字符串 阶段 异步 r文件
原文地址:https://www.cnblogs.com/lovecode3000/p/12323061.html