Vue动态路由缓存不相互影响的解决办法


Posted in Javascript onFebruary 19, 2019

关于react与vue中的key

之前在学习react的时候,常常遇到循环渲染组件时会提示需要在循环组件中加上key属性,比如有一组列表:

import React, { Component } from 'react';

export default calss MainApp extends Component {
 state = {
  student: [
  {
   name: 'Jenny',
   id: 'a001'
  },
  {
   name: 'Jerry',
   id: 'a002'
  },
  ]
 }

 render() {
  return (
   <div>
     <ul>
     {
      this.state.student.map(item => {
       // key是必须的属性,不然浏览器会抛出错误提示
       return (<li key={item.id}>{item.name}</li>) 
      })
     }
     </ul>
    </div>
  )
 }
}

可能对这个key不是太了解,或者也不许要太深入地去了解它,只知道在循环渲染组件时,随手加上这个属性就好。摘自网上的的文章的总结,key的作用为

key的作用主要是为了高效的更新虚拟DOM

虽然不是很懂,但也装作大切大悟的样子。key是一个给框架内部用的,我们只管给它加上去就好。

Vue中的key

同样有一个vue的组件:

<template>
 <div>
  <ul>
   <!-- key是必须的属性,不然浏览器会抛出错误提示 -->
   <li v-for="itme in student" :key={item.id}>{{item.name}}</li>
  </ul>
 </div>
</template>

<script>
import vue from 'vue';
import { Component } from 'vue-property-decorator'

@Component
export default calss MainApp extends vue {
 student = [
  {
   name: 'Jenny',
   id: 'a001'
  },
  {
   name: 'Jerry',
   id: 'a002'
  },
 ]
}
</script>

同样的,回到vue中的key,其实也类似,解释key的作用,就不得不介绍一下虚拟DOM的diff算法了...算了,我也不是很懂
简单理解就是react与vue内部判断组件的一个标识,用于更新或者重用组件的一个重要属性

更新

key用于更新:是框架内部的算法实现,一两句话也说不清楚(主要是我也不懂这个算法),简单理解为当数据更新了,框架内部会判断更新页面哪些DOM元素需要更新删除等操作;

重用

key用于组件重用:其实key不止是在map或者v-for中使用,我们也也可以在其他组件上使用这个属性(至于哪个组件可以加,小孩子才做选择,我们的目标是全都加!),当然加了貌似也没什么毛病,只是加了显得有些多余!
在做SPA的时候,我们都会有一个主组件App.vue:

<template>
 <div id="app">
  <div>
   <keep-alive>
    <router-view />
   </keep-alive>
  </div>
 </div>
</template>

<script>
import Vue from 'vue'
import { Component } from 'vue-property-decorator'

@Component
export default class MainApp extends Vue {
 
}
</script>

上面代码会把页面全部都缓存下来(路由切换回来的时候,页面表单填写的内容没有被清空),这是应为在<router-view />的外面包裹着keep-alive标签, 页面数据都保留下来了,避免用户切换路由,数据丢失的情况,看似很完美!

比如一个产品页面:

当两个路由都使用同一个组件如Product.vue这个组件时,来回切换两个路由,两个页面填写的东西就会共用!切换页面时,发现页面自动填写了上个页面的东西,这并不是我们想要的!

如果页面比较少, 比如只有A、B两个产品,可以每个页面都定义一个路由地址,并且name属性不一样的值:

{
 path: '/product',
 name: 'product',
 component: Product,
 children: [
  {
   path: 'a',
   name: 'aProduct',
   component: Detail
  },
  {
   path: 'b',
   name: 'bProduct',
   component: Detail
  },
 ]
}

这时这样<router-view :key="$route.name"/>就解决上面的问题了

But,页面较多的时候,定义路由就不能像上面这样定义了:

{
 path: '/product',
 name: 'product',
 component: Product,
 children: [
  {
   path: 'detail/:id',
   name: 'aProduct',
   component: Detail
  },
 ]
}

此时路由变成了动态的了,那么,key就不能取name的值了,此时就需要引入一个变量来存储路由的历史记录了,当路由切换时,在历史记录中匹配相应的路由,在历史记录中保存的一个位置值,取出来赋值个key就可以了

嗯,前面好像废话有点多,而且貌似有骗标题的嫌疑,其实理解key这个属性,对于解决页面缓存,组件重复不相互影响有重要的作用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习并汇集javascript匿名函数
Nov 25 Javascript
jQuery移动和复制dom节点实用DOM操作案例
Dec 17 Javascript
JS图片根据鼠标滚动延时加载的实例代码
Jul 13 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
Feb 23 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
axios拦截设置和错误处理方法
Mar 05 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
Jul 24 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
详解如何在Canvas中添加事件的方法
Apr 17 Javascript
JavaScript严格模式不支持八进制的问题讲解
Nov 07 Javascript
JS实现的全选、全不选及反选功能【案例】
Feb 19 #Javascript
JS/jQuery实现简单的开关灯效果【案例】
Feb 19 #jQuery
Vue结合后台导入导出Excel问题详解
Feb 19 #Javascript
Vue.js实现可排序的表格组件功能示例
Feb 19 #Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 #Javascript
小程序转发探索示例
Feb 19 #Javascript
JS异步执行结果获取的3种解决方式
Feb 19 #Javascript
You might like
十天学会php之第三天
2006/10/09 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
js断点调试经验分享
2017/12/08 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
闭幕式主持词
2014/04/02 职场文书
活动总结报告范文
2014/05/04 职场文书
热情服务标语
2014/10/07 职场文书
鲁迅故居导游词
2015/02/05 职场文书
党支部书记岗位职责
2015/02/15 职场文书
小学生表扬稿范文
2015/05/05 职场文书
高中家长意见怎么写
2015/06/03 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP