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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
尝试在让script的type属性等于text/html
Jan 15 Javascript
JS检测输入字符是否包含非法字符的示例代码
Feb 11 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
jQuery表单验证功能实例
Aug 28 Javascript
jQuery给指定的table动态添加删除行的操作方法
Oct 12 Javascript
jQuery实现遍历复选框的方法示例
Mar 06 Javascript
vue使用watch 观察路由变化,重新获取内容
Mar 08 Javascript
js实现随机数字字母验证码
Jun 19 Javascript
Vue项目环境搭建详细总结
Sep 26 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 Javascript
小程序实现文字循环滚动动画
Jun 14 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
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
Python完全新手教程
2007/02/08 Python
Python正则简单实例分析
2017/03/21 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
一道Delphi面试题
2016/10/28 面试题
创业计划书的写作技巧及要点
2014/01/31 职场文书
初一学生期末评语
2014/04/24 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
政审证明材料
2015/06/19 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
vue实现锚点定位功能
2021/06/29 Vue.js
MySQL批量更新不同表中的数据
2022/05/11 MySQL