arrays - $set 不适用于在 vue.js 中更新我的数组
问题描述
在 vue.js 应用程序中,我正在尝试使用 axios 使用来自 java/postgresql 后端的内容填充数组。我知道除非您使用 $set 关键字,否则 vue 不会跟踪对数组的更改。当我使用 $set 关键字时,我遇到了以下错误消息:
ManageTools.vue?45c2:109 Uncaught (in promise) TypeError: >_this2.userToolsIds.$set is not a function at eval (ManageTools.vue?45c2:109)
我已经尝试在我的函数的开头设置 vm=this,如此处详述... TypeError: this.$set is not a function 这没有帮助。
我必须改变什么?
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">
Tools
</h3>
</div>
<div class="card-body">
<div class="row row-eq-height">
<div class="col">
<FormDropdown
:field-content="selectedTool"
field-label="Tools"
field-name="tool"
:field-choices="tools"
field-description="Select a tool and click 'install' to install."
@updateValue="updateValue"
></FormDropdown>
<div class="row mt-2 mb-2">
<div class="col">
<button class="btn btn-primary" @click.prevent="installTool">Install Tool</button>
</div>
</div>
</div>
{{finishedFetchingToolIds}} {{finishedFetchingToolsInfo}}
<div class="col col-md-6" v-if="finishedFetchingToolsInfo">
Installed Tools
{{userTools}}
<ul>
<li v-for="tool in userTools" :key="tool">
toolname
{{tool.toolname}}
</li>
</ul>
</div>
</div>
</div>
<div v-if="showTool">
<foo>
</foo>
</div>
</div>
</template>
<style>
</style>
<script>
import axios from 'axios';
import store from "../store.js";
import FormDropdown from "@/components/FormDropdown";
export default {
name: "ManageTools",
components: {
foo: () => import('../test-plugin.js'),
FormDropdown
},
data() {
return {
showTool: false,
tools: ['mass-emailer', 'auto-text-messenger'],
selectedTool: 'mass-emailer',
userToolsIds: [],
userTools: [],
user_id: 2,
finishedFetchingToolIds: false,
finishedFetchingToolsInfo: false
}
},
methods: {
installTool() {
this.showTool = true;
console.log("showing tool");
},
updateValue() {
console.log("updating value");
}
},
watch: {
finishedFetchingToolIds() {
console.log("in watch for finishedFetchingToolIds")
for (var i = 0; i < this.userToolsIds.length; i++) {
axios.get("/tools/"+this.userToolsIds[i]).then(
response => {
console.log("tool info: "+response.data.toolname);
this.userTools.$set(i, response.data);
console.log("userTools[i]: "+this.userTools[i]);
console.log("finishedFetchingToolsInfo: "+this.finishedFetchingToolsInfo);
},
error => {
store.setAxiosErrorMessage("Failed to display tool info", error);
}
);
}
this.finishedFetchingToolsInfo = true;
}
},
mounted() {
console.log("mounted");
axios.get("/tools/installed_tools").then(
response => {
console.log("response.data[0] "+response.data[0].tool_id);
for (var i = 0; i< response.data.length; i++) {
console.log("iter = "+ i);
console.log("tool id: "+response.data[i].tool_id);
this.userToolsIds.$set(i, response.data[i].tool_id);
}
console.log("userToolsIds length: "+this.userToolsIds.length);
this.finishedFetchingToolIds = true;
},
error => {
store.setAxiosErrorMessage("Failed to display user tools info", error);
}
);
}
};
</script>
可以在这里使用数组还是对象更合适?
解决方案
this.userToolsIds.$set(i, response.data[i].tool_id);
...应该:
this.$set(this.userToolsIds, i, response.data[i].tool_id);
...,其中this.userToolsIds[i]
填充response.data[i].tool_id
.
ViewModel 有一个$set
方法,而不是你的数据。
请参阅文档。
推荐阅读
- math - n/1 + n/2 + n/3 + 的大 O 复杂度
- java - Java:为什么由超类初始化的变量在创建对象后保持值
- c# - Enable-Migrations 不起作用“Exceção ao chamar “LoadFrom” com “1” argumento(s)”
- flutter - 在 Flutter Text Widget 中调整新的行距
- android - 在 Android Studio 北极狐更新之后,Android 工作室花费了很长时间来构建项目
- html - 如何在表单中编写预先格式化的文本?
- r-markdown - Rmarkdown 官员:交叉引用 block_captions 编号不正确
- windows - Windows 任务计划程序无法停止 exe
- linux - 无法将 linux NFS 共享挂载到 Windows 2019
- python - 使用 SqlAlchemy 代理到基于字典的集合时如何避免 IntegrityError