问题描述

使用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. iOS核心动画の摘记

  2. android Instrumentation 转载

      Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架.尽管你可以使用JUnit测试Android工程,但Android工具允许你为应用程序的各个 ...

  3. 2018/04/18 每日一学Linux 之 ssh关闭密码登录

    在平常工作中,常常需要关闭 SSH 的密码登录,只留 SSH 证书登录. 好处显而易见,避免了经常输入密码导致的密码泄露,和设置密码导致被暴力破解的可能性. -- 方法也很简单,首先 你是可以 登录 ...

  4. 【python基础】字符串格式化(% VS format)

    字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 ...

  5. IO流(5)判断功能

    判断功能: * public boolean isDirectory():判断是否是目录 * public boolean isFile():判断是否是文件 * public boolean exis ...

  6. MyEclipse安装及破解步骤

    MyEclipse2013 (32+64)下载地址(建议使用迅雷下载)http://downloads.myeclipseide.com/downloads/products/eworkbench/2 ...

  7. Spark Streaming性能优化: 如何在生产环境下应对流数据峰值巨变

    1.为什么引入Backpressure 默认情况下,Spark Streaming通过Receiver以生产者生产数据的速率接收数据,计算过程中会出现batch processing time > ...

  8. POJ1062:昂贵的聘礼(枚举+迪杰斯特拉)

    http://poj.org/problem?id=1062 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为 ...

  9. 安插,复制,替换和删除ul中的li

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 安恒X计划12月月赛

    ezweb 主要是序列化问题.没有PHP环境,在线运行的.实例化对象之后修改一下file.然后echo输出序列化的结果.不过下面有一个正则检查.数字前加一个+,影响了正则的匹配,但是对于序列化的还原没 ...