问题描述

使用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. Python爬虫框架Scrapy实例(四)下载中间件设置

    还是豆瓣top250爬虫的例子,添加下载中间件,主要是设置动态Uesr-Agent和代理IP Scrapy代理IP.Uesr-Agent的切换都是通过DOWNLOADER_MIDDLEWARES进行控 ...

  2. 站内SEO规范

    一:文章的原创性 1.修改文章的标题,尽可能的选择新颖的,符合用户搜索习惯的标题. 2.修 改首段内容或自己动手来添加首段文字信息. 3.文章中图片ALT属性的修改和添加. 4.在不影响阅读的情况下, ...

  3. IDEA的快捷键和相关设置

      快捷键 Shift + Shift: 查找一切 Alt + /: 代码提示(需要修改) Ctrl + Alt + F12: 打开文件所在磁盘位置 Alt + F12: 打开终端 Alt + Ins ...

  4. Idempotent --------幂等

    1.在某二元运算下,幂等元素是指被自己重复运算的结果等于它自己的元素.例如,乘法下唯一两个幂等实数为0和1.

  5. python 基础 集合

    集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 交集 并集 差集 子集  对称差集 list ...

  6. ssh stricthostkeychecking=0

    SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击. 但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. ...

  7. kettle中源和目标表结构不一致的情况处理

    创建数据仓库的过程中,往往会遇到这样的问题,例如:源表由于业务原因新增了字段,而ETL程序中是按照之前的源表结构进行抽取的,那么如果不重新构建ETL程序,新的指标就不会流入DW,问题如下图所示 创建了 ...

  8. <转>MySQL临时表的简单用法

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  9. maven工程插件配置

    <build> <!-- 该级工程会加载插件,放在父工程里 --> <plugins> <!-- 资源文件拷贝插件 --> <plugin> ...

  10. 提示'HTTP消息不可读'

    1.提示下面的错误信息 2.修改后的代码,费用接口 import unittest import requests import json import HTMLTestRunner ur1 = 'h ...