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 相关文章推荐
IE与FireFox中的childNodes区别
Oct 20 Javascript
ie6下png图片背景不透明的解决办法使用js实现
Jan 11 Javascript
基于jQuery实现图片的前进与后退功能
Apr 24 Javascript
Bootstarp风格的toggle效果分享
Feb 23 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
Aug 21 Javascript
利用JavaScript判断浏览器类型及版本
Aug 23 Javascript
js判断出两个字符串最大子串的函数实现方法
Nov 01 Javascript
node.js基于mongodb的搜索分页示例
Jan 22 Javascript
Vue实现左右菜单联动实现代码
Aug 12 Javascript
微信小程序 button样式设置为图片的方法
Jun 19 Javascript
原生js canvas实现鼠标跟随效果
Aug 02 Javascript
详解Vue中的watch和computed
Nov 09 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
浅谈javascript的调试
2015/01/28 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
电信营业员自我评价分享
2014/01/17 职场文书
护士检查书
2014/01/17 职场文书
党员干部承诺书
2014/03/25 职场文书
2016年五一促销广告语
2016/01/28 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python