javascript - 如何在 vuejs 中反应性地渲染外部数组
问题描述
我做了一个小库来跟踪我所有 api 调用的加载。
它基本上是一个数组,其中包含描述一个加载过程的对象。我将此库导入到单个文件组件中以对其进行调用。然后,我将数组从库传递给子组件,并希望呈现数组中的所有对象(加载状态)。我在子组件的 Vue Devtools 中看到数据正在更新,但是页面中没有更新。
我尝试了什么:
- 从父组件传递 vue 实例并使用 $set 更新数组
- 使用 array.splice 更新数组
- 用 Object.assign 创建一个新对象,更新新对象然后更新数组(splice/$set)
- 在更新 w 对象时传递密钥并更新此密钥
- 在控制台调用库中的方法
样本更新功能:
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
}
}
}
一些可能有用的更多信息:
库结构:
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 中导入库并在挂载的钩子中调用它
import loadhelper from "../../helpers/Loadstatus.js";
...
data() {
return {
loadstatus: null
}
}
...
mounted() {
this.loadstatus = loadhelper.makeLoadManager(this);
}
我的问题归结为:如何从 vue.js 库中响应式渲染或正确更新数组。
如果这有助于回答我的问题,我很乐意提供更多信息。
解决方案
如果您的库正在创建(和管理)“加载器”数组,您可以做的最简单的事情是在 Vue 组件的数据中定义空的响应式数组,并在mounted
挂钩中为您的库数组分配一个引用。像这样:
import LoadingStatus from "./components/LoadingStatus";
import loadhelper from "./helpers/LoadManager.js";
export default {
name: "App",
components: {
LoadingStatus
},
data() {
return {
statuses: []
};
}
mounted() {
this.statuses = loadhelper.getAllLoaders();
}
};
Vue 采用您的库提供的数组并使其具有反应性。您可以使用这样的模板:
<LoadingStatus :statuses="statuses"/>
查看演示
只要 Vue 和您的“负载管理器”都使用同一个数组(参考),一切都很好。我添加了setTimeout
回调LoadManager
,以证明“从 Vue 外部”对数组的更改将使 Vue 组件重新渲染......
推荐阅读
- javascript - useEffect 钩子在 setTimeout 和 state 中行为不端
- elasticsearch - elasticsearch:没有已知的主节点,安排重试
- google-cloud-platform - 我可以在自己的虚拟机实例上运行云构建吗
- asp.net-mvc - 如何强制主页运行 IE11 和 iFrame 运行 IE7
- sql - Oracle - 有没有办法重写我的查询以减少我查询表的次数
- python - 单击“退出”时,Tkinker 窗口没有响应
- couchbase - 更新 Couchbase 中的嵌套 json 数组字段
- sql - 如何不断更新从具有不同更新时间的多个表创建的表
- c# - 只计算一次 blob
- r - 循环遍历所有 R 数据框列并删除与目标列具有低于阈值的相关因子的列