问题描述

使用Element-UI中的table组件时会遇到一个常见的问题。当在el-table中调用子组件的时候会出现数据更新后,子组件没有重新渲染的问题。

eg:资源列表中的健康度组件。



代码如下:

	<el-table :data="sourceData" class="resource_list_data" v-loading="loading" size="mini" :default-sort="{prop: 'update_time', order: 'descending'}" @sort-change="handleSortChange">
<el-table-column prop="name" label="资源名称">
<template slot-scope="scope">
<el-tooltip effect="dark" :openDelay="500" :content="`点击进入${scope.row.name}管理页面`" placement="top">
<a @click="manageClick(scope.row.id)"> {{scope.row.name}}</a>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="res_type_name" label="资源类别">
</el-table-column>
<el-table-column prop="ip" label="IP">
</el-table-column>
<el-table-column prop="probe_name" label="采集器" :formatter="probeFormatter">
</el-table-column>
<el-table-column prop="desc_" label="描述" :formatter="descriptionFormatter">
</el-table-column>
<el-table-column prop="health_degree" label="健康度">
<template slot-scope="scope">
<HealthDegree :degree="scope.row.health_degree"></HealthDegree>
</template>
</el-table-column>
<el-table-column prop="update_time" label="更新时间">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<BlueButton title="管理" @click.native="manageClick(scope.row.id)" />
<RedButton title="删除" @click.native="ruleDelete(scope.row)" />
</template>
</el-table-column>
</el-table>

理论上当我更新数据的时候,sourceData的值已经发生了改变(而不是其中的某个字段发生了改变),子组件应该获取的数据更新并重新渲染。实际上该页面的健康度组件只会保留第一次界面初始化的渲染页面。

解决方法

这是Element-UI的一个bug,解决方案是从el-table中增加一个row-key属性,并为row-key设置一个能唯一标识的字段名。假如你的数据中能够唯一标识的字段是id,那你就设置为id。这样就解决了这种问题。

eg:代码如下

	<el-table :data="sourceData" class="resource_list_data" row-key="id" v-loading="loading" size="mini" :default-sort="{prop: 'update_time', order: 'descending'}" @sort-change="handleSortChange">
<el-table-column prop="name" label="资源名称">
<template slot-scope="scope">
<el-tooltip effect="dark" :openDelay="500" :content="`点击进入${scope.row.name}管理页面`" placement="top">
<a @click="manageClick(scope.row.id)"> {{scope.row.name}}</a>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="res_type_name" label="资源类别">
</el-table-column>
<el-table-column prop="ip" label="IP">
</el-table-column>
<el-table-column prop="probe_name" label="采集器" :formatter="probeFormatter">
</el-table-column>
<el-table-column prop="desc_" label="描述" :formatter="descriptionFormatter">
</el-table-column>
<el-table-column prop="health_degree" label="健康度">
<template slot-scope="scope">
<HealthDegree :degree="scope.row.health_degree"></HealthDegree>
</template>
</el-table-column>
<el-table-column prop="update_time" label="更新时间">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<BlueButton title="管理" @click.native="manageClick(scope.row.id)" />
<RedButton title="删除" @click.native="ruleDelete(scope.row)" />
</template>
</el-table-column>
</el-table>

还有一个解决方法是给table增加一个随机数的key

<el-table :key="Math.random()" ></el-table>

但是在chrome上会出现页面卡死,内存占用过高的问题。不建议使用

参考链接:

vue数据更新了,视图没有更新

vue组件库element-ui 的Table内容显示不更新

element-ui中table-column中template下元素不更新

解决Vue循环中子组件不实时更新的问题的更多相关文章

  1. Vue.js----更换头像不实时更新问题

    原因 导致问题的原因是缓存造成的,因为你图片变了但是读取头像的地址还会没有变化的 解决思路 所以解决的思路就是上传之后让图片地址改变,那么我们就可以在上传的时候给地址加上一个时间戳那么久可一达到目的了 ...

  2. 解决vue中element组件样式修改无效

    vue中element组件样式修改无效 <style> .detail{ .el-input__inner { height: 48px; } } </style> 直接写st ...

  3. 【vue】vue使用Element组件时v-for循环里的表单项验证方法

    转载至:https://www.jb51.net/article/142750.htm标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中 ...

  4. Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?

    原文:https://blog.csdn.net/zhouweixue_vivi/article/details/78550738 2017年11月16日 14:22:50 zhouweixue_vi ...

  5. vue中子组件更新父组件

    当在子组件里更改了某些信息且关闭子组件后,需要父组件更新修改后的内容,该如何操作 1.$emit触发 父组件 @add="add(val)" 子组件 this.$emit('add ...

  6. 解决vue中对象属性改变视图不更新的问题

    在使用VUE的过程中,会遇到这样一种情况, vue data 中的数据更新后,视图没有自动更新. 这个情况一般分为两种, 一种是数组的值改变,在改变数组的值的是时候使用索引值去更改某一项,这样视图不会 ...

  7. Vue解决同一页面跳转页面不更新

    问题分析:路由之间的切换,其实就是组件之间的切换,不是真正的页面切换.这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新. 方案一:使用 watch 进行监听 watch: { /* = ...

  8. 在vue中子组件修改props引发的对js深拷贝和浅拷贝的思考

    不管是react还是vue,父级组件与子组件的通信都是通过props来实现的,在vue中父组件的props遵循的是单向数据流,用官方的话说就是,父级的props的更新会向下流动到子组件中,反之则不行. ...

  9. Core 2.0 的dll实时更新、https、依赖包变更问题及解决

    今天所有开发环境已经迁移到mac OS下的Visual Studio Code + 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了. 只要你Relese编译并在本地有一个与 ...

随机推荐

  1. java正则表达式使用

    用正则表达式进行字符串校验,截取十分方便,项目开发中灵活的使用正则表达式能让你的代码简洁优雅并且不易出错.在实际的应用中,掌握以下几点知识就可以应付绝大多数的开发场景了. 1. 字符串开始结束匹配:^ ...

  2. Guideline 2.1 - Information Needed

    For information about testing your app and preparing it for review, please see Technical Note TN2431 ...

  3. m4a 转 wav

    https://blog.csdn.net/zjm750617105/article/details/80148473 sox 不行, ffmpeg 很麻烦, 考虑用 avconv 很简单: 安装: ...

  4. Vue源码学习1——Vue构造函数

    Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只 ...

  5. 删除server服务文件

    某用户升级ArcGIS for Server后,出现了之前版本server中的服务残留的现象,且服务访问不正常,怎样彻底删除的残留文件. 即怎样删除ArcGIS for Server中发布的某个服务涉 ...

  6. 安装JIRA

    参考链接:https://www.cnblogs.com/houchaoying/p/9096118.html mysql-connector插件下载: https://mvnrepository.c ...

  7. Redis 启动警告错误解决

    启动错误 1.WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. T ...

  8. Linux文件目录介绍及文件颜色区别

    文件颜色代表含义: 蓝色表示目录: 绿色表示可执行文件: 红色表示压缩文件: 浅蓝色表示链接文件: 白色表示其他文件: 黄色是设备文件,包括block, char, fifo. 常见目录解释 Linu ...

  9. 【剑指offer】变态跳台阶

    一.题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路: f(n)=f(n-1)+f(n-2)+...+f(0),f(1) ...

  10. solr客户端的使用

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP0AAACqCAYAAABmvkmzAAAACXBIWXMAAA7JAAAOygG3NjBLAABkG0