【发布时间】:2019-11-28 16:11:03
【问题描述】:
我创建了一个小型库来跟踪我所有 api 调用的加载情况。
它基本上是一个数组,其中包含描述一个加载过程的对象。我将此库导入到单个文件组件中以对其进行调用。然后,我将数组从库传递给子组件,并希望呈现数组中的所有对象(加载状态)。我在子组件的 Vue Devtools 中看到数据正在更新,但是它没有在页面中更新。
我尝试了什么:
- 从父组件传递vue实例并使用$set更新数组
- 使用array.splice 更新数组
- 使用 Object.assign 创建新对象,更新新对象,然后更新数组 (splice/$set)
- 在更新对象时传递一个键并更新这个键
- 在控制台中调用库中的方法
样本更新函数:
function _finish(name, descFinished) {
const i = _loaders.findIndex(l => l.name == name);
if(i < 0) throw new NameNotFoundException(name);
let loader = Object.assign({}, _loaders[i]);
if(descFinished != undefined) loader.descFinished = descFinished;
loader.loading = false;
loader.error = false;
loader.endTime = new Date();
vm.$set(_loaders, i, loader);
return _loaders[i];
}
我这样传递给子组件
<loading-status v-if="loadstatus" :statuses="loadstatus.getAllLoaders()"></loading-status>
子组件看起来这个
<template>
<div v-if="statuses">
<div v-for="status in statuses" :key="status.name">
<div>
{{ status.loading == true ? 'true' : 'false' }}
</div>
</div>
</div>
</template>
<script>
export default {
name: 'loading-status',
props: {
statuses: {
type: Array,
required: true
}
}
}
image of the array not being reactive on the page
更多可能有用的信息:
库结构:
function loadmanager(vueinstance) {
//library internals here
// for example my array i want to render:
let _loaders = [];
var publicInterface() {
//public accesable functions here
//i call this to pass the array to my child component
getAllLoaders() {
return _loaders;
}
}
return publicInterface;
}
exports.makeLoadManager = loadmanager;
我在vue SFC中导入库并在mounted hook中调用
import loadhelper from "../../helpers/Loadstatus.js";
...
data() {
return {
loadstatus: null
}
}
...
mounted() {
this.loadstatus = loadhelper.makeLoadManager(this);
}
我的问题归结为:如何从 vue 中的 js 库响应式渲染或正确更新数组。
如果这有助于回答我的问题,我很乐意提供更多信息。
【问题讨论】:
-
把你的外部库转换成 vuex 模块怎么样?
-
如果可能的话,我想保留一个外部库,这样我就可以在其他项目中重用它。
-
如果您的唯一要求是便携性,您可以创建vuex plugin
-
这看起来很有趣,如果没有其他提示,我会尝试一下。谢谢。
标签: javascript arrays vue.js