javascript - VueJS 组件不更新数据
问题描述
我知道有很多关于 VueJS 组件中未更新数据的类似问题,但我仍然找不到答案。我有以下组件:
<template>
<div class="mt-5">
[...]
<div v-for="dataSource in dataSources" v-bind:key="dataSource.id">
{{ dataSource}}
</div>
[...]
</div>
</template>
<script>
import { chain, find, merge, toUpper } from "lodash";
import Mixins from "../utils/Mixins.vue";
import Pagination from "../utils/Pagination.vue";
import DataSourceTable from "./DataSourceTable.vue";
export default {
mixins: [Mixins],
components: {
"data-source-table": DataSourceTable,
"data-source-pagination": Pagination
},
data: function() {
return {
dataSources: [],
//[...]
};
},
methods: {
getAllDataSources(page) {
//[...]
},
search() {
//[...]
},
setSortAttribute(attribute) {
//[...]
},
updateDataSource(updatedDataSource){
for (let i = 0; i < this.dataSources.length; i++) {
if (this.dataSources[i].id == updatedDataSource.id) {
this.dataSources[i] = updatedDataSource;
break; // Stop this loop, we found it!
}
}
}
},
created: function() {
this.getAllDataSources(this.currentPage);
// Capture updated data source via websocket listener
this.$options.sockets.onmessage = function(data) {
let message = JSON.parse(data.data);
if (message.id == "dataSource" && message.type == "data") {
let updatedDataSource = message.payload.data.listen.relatedNode;
this.updateDataSource(updatedDataSource);
}
}
}
};
</script>
在created
钩子中,我捕获了来自 websocket 的更改,并更新了数组中的相应项目dataSources
。我可以看到该项目在 Vue 开发工具中已正确更新,但在组件模板中仍未更新。下面的例子:
解决方案
这是 vuejs 的常见错误。你可以在这里查看文档:为什么 DOM 没有更新? 在您的情况下,您可以使用 push 或 $set 来实现您的目的。
当您通过直接设置索引(例如 arr[0] = val)或修改其长度属性来修改数组时。同样,Vue.js 也无法获取这些更改。始终使用 Array 实例方法或完全替换它来修改数组。Vue 提供了一个方便的方法 arr.$set(index, value),它是 arr.splice(index, 1, value) 的语法糖。
例子:
- 代替
this.dataSources[i] = updatedDataSource;
- 经过
this.dataSources.splice(i, 1, updatedDataSource);
推荐阅读
- kibana - ELK - 格式化 SIEM 警报
- python - 高效地计算矩阵中所有行的运算
- python-3.x - 自定义模型功能上的 Django 管理员 list_filter
- electron - ElectronJS 上的会话问题
- python-3.x - 如何从雪花中的“存储集成”中选择价值?
- javascript - 删除某些重复的单词并重新排列字符串中的单词
- hadoop - 安装 hadoop-3.1.4 'hdfs' 时出错,未重新配置
- python - 如何在 Python 中通过匹配外部列表中的一个值来提取列表中的列表?
- javascript - 我可以在更新类组件状态的函数组件中触发 onclick 事件吗?
- php - 如何在 php 中将 unicode 字符从“孤立”的上下文形式更改为通用 Unicode 阿拉伯语