vue多级路由keep alive问题,vue-router keep-alive

  vue多级路由keep alive问题,vue-router keep-alive

  本文主要详细介绍vue路由保护和保活。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。

  

目录

   Vue-Router lazy loading如何定义动态路由参数模式查询模式Vue-Router导航守护全局路由钩子router.beforeEach路由独占守护组件guard BeforeRouteUpdateBeforeRouteVue路由钩子在生命周期函数的实现中,keep-alive生命周期钩子activateddeactivated触发钩子的完整序列摘要。

  

Vue-Router懒加载

  1、箭头函数+import

  const List=()=import( @/components/List . vue )

  const router=new VueRouter({

  路线:[

  {路径:“/list”,组件:List }

  ]

  })

  2、箭头函数+require

  常量路由器=新路由器({

  路线:[

  {

  路径:“/list”,

  component:resolve=require([ @/components/list ],resolve)

  }

  ]

  })

  

如何定义动态路由

  

param方式

  路由格式:/router/:id传输方式:对应值传输后形成的路径遵循路径:/router/123路由定义

  //在APP.vue中

  路由器链接:to=/user/userid 替换用户/路由器链接

  //在index.js中

  {

  路径:“/user/:userid”,

  组件:用户,

  },

  路由跳转

  //方法1: router-link: to= {name: users ,params:{ my name:Jake } button/router-link//方法2: 3:this。$router.push//({name: users ,params: {my name: Jake}})

  Router-link: to= {name: users ,params: {my name: Jake}} 按钮/router-link

  //方法二:

  这个。$router.push({name:users ,params:{myname:jake}})

  //方法三:

  这个。$router.push(/user/ jake)

  参数获取:通过$ route.params.userid获取传递的值。

  

query方式

  配置格式:/router,即正常配置。传递方式:查询的关键字作为对象中的传递方式。交付后形成的路径:/route?id=123 .路由定义

  //方式一:直接以router-link标签上的对象的形式

  路由器链接:to= {path:/profile ,查询:{name: why ,age: 28,height: 188}} 文件/路由器链接

  //方式二:写成按钮点击事件窗体。

  button @ click= profile click my/button

  profileClick(){

  这个。$router.push({

  路径:“/profile”,

  查询:{

  姓名:科比,

  年龄: 28 ,

  身高:198

  }

  });

  }

  跳转方法

  //方法一:

  路由器链接:to= {name: users ,query: {uname: James}} 按钮/路由器链接

  //方法二:

  这个。$router.push({ name: users ,query:{ uname:james }})

  //方法三:

  路由器链接:to= {path:/user ,query: {uname: James}} 按钮/路由器链接

  //方法四:

  这个。$router.push({ path: /user ,query:{ uname:james }})

  //方法五:

  这个。$router.push(/user?uname= jsmes)

  获取参数:通过$ route.query获取传递的值。

  

Vue-Router导航守卫

  有时候,需要通过路由来执行一些操作,比如最常见的登录授权验证。当用户满足条件时,将被允许进入导航,否则,将取消跳转,跳转到登录页面进行登录。由于这个原因,有许多方法来嵌入路线的导航过程:全局的、专用于单个路线的、或者组件级的。

  

全局路由钩子

  vue-router全局有三个守卫:

  router . before每个全局前警卫进入路线前。Router.beforeResolve全局解析保护,在beforeRouteEnter调用后调用。路由器。每本全球邮册进入路线后。to、from、next这三个参数:

  和to from是将要进入和离开的路线对象,路线对象指的是通常通过这个获得的路线对象。$route。下一步:函数该参数为函数,必须调用,否则无法输入进路(空白页)。

  Next()输入路线。Next(false):取消来话路由,将url地址重置为发话路由地址(即将要离开的路由地址)。

  

router.beforeEach

  Router.beforeEach是全局前沿守卫,在进入路由之前。

  router.beforeEach((收件人,发件人,下一个)={

  let ifInfo=vue . prototype . $ common . getsession( user data );//存储的确定是否登录的信息

  如果(!ifInfo) {

  sessionstorage中没有存储用户信息。

  if (to.path==/) {

  //如果是登录页面路径,直接next()

  next();

  }否则{

  //否则跳转登录。

  Message.warning(请重新登录!);

  window . location . href=vue . prototype . $ log in URL;

  }

  }否则{

  返回next();

  }

  })

  

路由独享守卫

  如果您不想全局配置防护,您可以为某些路由单独配置防护:

  const router=new VueRouter({

  路线:[

  {

  路径:“/home”,

  成分:家,

  beforeEnter:(收件人,发件人,下一个)={

  //参数用法相同。调用序列在全局保护之后,因此不会被全局保护覆盖。

  //.

  }

  }

  ]

  })

  

组件内的守卫

  

beforeRouterEnter

  BeforeRouterEnter不能访问它,因为钩子是在组件实例创建之前调用的,所以它不能获取组件实例this。您可以通过向next发送回调来访问组件实例。

  beforeRouteEnter(收件人,发件人,下一个){

  Console.log(路由独占保护后调用);

  接下来(虚拟机={

  //通过 VM 访问组件实例this 在挂载后执行回调,

  })

  }

  

beforeRouteUpdate

  beforeRouteUpdate(收件人,发件人,下一个){

  //当当前路由更改,但组件被多路复用时,调用可访问的组件实例“this”。

  //比如对于一个带有动态参数的path /user/:id,在/user/1和/user/2之间跳转时,

  //由于将呈现相同的用户组件,组件实例将被重用。在这种情况下这个钩子将被调用。

  }

  

beforeRouteLeave

  在导航这个组件对应的路由时调用,我们用它来禁止用户离开,比如草稿还没有保存,或者在用户离开前破坏setInterval,防止离开后定时器还在调用。

  beforeRouteLeave(收件人、发件人、下一个){

  If(物品保存){

  next();//允许离开或跳转到另一个路由,如上所述。

  }否则{

  下一个(假);//取消出发

  }

  }

  

Vue路由钩子在生命周期函数的体现

  完整的路线导航解决流程(不包括其他生命周期):

  触发对其他路线的访问。调用组件guard beforeRouteLeave离开路由,调用全局前端guard: beforeEach调用beforeRouteUpdate调用重用组件中的独占guard beforeEnter。解析异步路由组件。在传入路由组件中调用beforeRouteEnter,并在确认解析导航之前调用全局解析保护。调用全局post钩子的afterEach钩子。触发DOM更新(已安装)。在beforeRouteEnter guard中执行传递给next的回调函数。

  

keep-alive

  在vue项目的开发中,大部分组件不需要多次渲染,所以vue提供了内置的组件keep-alive来缓存组件的内部状态,避免重新渲染。

  Document:类似于,是一个抽象组件:它本身不呈现DOM元素,也不出现在父组件链中。

  

生命周期钩子

  在keep-alive包含的组件/路由中,会多两个生命周期的钩子:激活和去激活。

  

activated

  Activated在首次呈现组件时调用,然后在每次激活缓存组件时调用。首次进入缓存路由/组件,挂载后,beforeRouteEnter守护传递给next的回调函数并调用:

  BeforeMount=其他路由进入(被破坏/停用)=

  Mounted=激活以进入高速缓存组件=在RouteEnter回调之前执行

  因为组件是缓存的,所以当您再次输入缓存的路由/组件时,不会触发这些挂钩:beforeCreate,created,beforeMount,mounted。

  所以之后的调用时机是:

  销毁已销毁的组件/或保持缓存停用=激活并输入当前缓存组件=执行beforeRouteEnter回调。

  

deactivated

  停用(离开路由时调用组件)。如果使用keep-alive,则不会调用beforeDestroy(组件销毁前的钩子)和Destroy(组件销毁),因为组件没被销毁是缓存的。

  这个钩子可以看作是beforeDestroy的替代品。如果你缓存组件,并想在组件被销毁时做些什么,你可以把它们放在这个钩子中。如果你离开路线,它将依次触发:

  在route Leave=route front guard before each=global rear hook after each=deactivated之前保留当前的route hook保留缓存组件=激活输入缓存组件(如果还输入了缓存路由)

  //如果离开的组件没有缓存,beforeDestroy将替换deactivated。

  //如果进来的路由没有缓存,全局post钩子after each=destroyed=before create等等。

  那么,如果只是想缓存其中几个路由/组件该怎么办呢?

  Vue2.1.0之前:两个keep-alive标签+v-if判断

  点火电极

  路由器视图v-if=$route.meta.keepAlive

  !-以下是将被缓存的路线-

  /路由器-查看

  /保持活力

  路由器-查看v-if=!$route.meta.keepAlive

  !-因为使用了v-if,所以将在下面创建一个未缓存的路由视图出口-

  /路由器-查看

  //路由器配置

  新路由器({

  路线:[

  {

  路径:“/”,

  姓名:家,

  成分:家,

  元:{

  keep:true//需要缓存

  }

  },

  {

  路径:“/:id”,

  名称:编辑,

  组件:编辑,

  元:{

  KeepAlive: false //不需要缓存

  }

  }

  ]

  });

  Vue2.1.0版本之后:Vue添加了两个新属性,以便在保持活动的情况下有条件地缓存路由/组件。

  包括:匹配的路由/组件将被缓存排除:匹配的路由/组件将不被缓存(具有高优先级)。include和exclude支持三种有条件缓存路由的方式:逗号分隔字符串、常规形式和数组形式。和常规数组形式,后者必须以v-bind形式使用。

  Keep-alive包括=a,b//逗号分隔形式

  组件:is= view /组件

  /保持活力

  

触发钩子的完整顺序

  结合路线导航、保持活动和组件生命周期挂钩,触发序列假定为您第一次离开组件A并进入组件B:

  BeforeRouteLeave:路由组件的组件离开预路由钩子,可以取消路由出发。BeforeEach:路由的全局前置守护,可用于登录验证、全局路由加载等。enter:routing before route enter独占守护:布线组件的组件在布线前进入钩子。BeforeResolve:全局解析保护afterEach:全局posthook beforeCreate:组件生命周期,无法访问。已创建:组件生命周期,这个可以访问,但是dom不能访问。Before:组件生命周期停用:保留缓存组件A,或者触发A的beforeDestroy和destroyed组件销毁钩子。挂载:访问/操作dom。已激活:输入的缓存组件和嵌套子组件(如果有)。接下来执行beforeRouteEnter回调函数。其实大部分的生命周期钩子函数都不会用到,但是有几点需要注意:

  1.ajax请求最好放在created中,在这种情况下可以访问它,请求返回的数据可以放在data中。

  2.关于dom的操作应该放在mounted里面,在mounted前面访问dom会不定义,因为渲染还没有完成。

  3.每次需要一些操作来进入或离开一个组件时:

  你可以在不进入缓存的时候使用创建的和挂载的钩子,在离开的时候使用之前和销毁的钩子。之前和销毁可以可以访问这个和销毁可以访问这个。

  缓存组件:缓存组件后,重新输入组件将不会触发beforeCreate、created、beforeMount和mounted。如果你想在每次进入组件时都做些什么,你可以把它放在激活到缓存组件的钩子中。同样,在离开缓存组件时,beforeDestroy和destroyed也不会被触发,可以使用deactivated离开缓存组件的钩子来代替。

  

总结

  本文到此为止。希望能帮到你,也希望你能多关注我们的更多内容!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: