vue.js - 如何避免在外部 js 类文件中使用 Vue.set() 来保留嵌套对象属性的反应性?
问题描述
我有这个组件:
<template>
<div class="simple-editor">
{{editor.view.toolbarManager.buttons}}
<component
v-for="(button, name) in editor.view.toolbarManager.buttons"
:is="button.component"
:options="button.options"
:key="name"
></component></div>
//.......................
我正在尝试editor.view.toolbarManager.buttons
在v-for
循环内使用。Vue devtools 向我展示了(以下所有 3 种情况)它editor.view.toolbarManager.buttons
是一个对象并包含 4 个包含另一个对象的属性。
<script>
export default {
data: function() {
return {
editor: new Editor({
doc: this.value,
init: this.init,
}),
}
},
editor.view.toolbarManager.buttons
Editor()
正在使用动态导入的脚本填充类的子类,如下所示:
props.plugins.forEach(plugin => {
this.plugins[plugin] = import(/* webpackMode: "eager" */ '../plugin/' + plugin);
});
我这样填写editor.view.toolbarManager.buttons
:
// case 1: works fine as expected
Vue.set(this.buttons, name, {
component,
options,
});
/* case 2: loses vue reactivity
var button = {};
button[name] = {
component,
options,
};
Object.assign(this.buttons, button);
*/
/* case 3: loses vue reactivity
this.buttons[name] = {
component,
options,
};
*/
接下来是问题:当我尝试{{editor.view.toolbarManager.buttons}}
在模板中渲染时,我看到案例 2 和 3 的空对象如下:
{}
这意味着 vue 反应性被破坏了。Editor()
是外部类,我不想将它绑定到 Vue。由于使用拼接/推送方法,Vue 反应性适用于数组的外部类。是否存在具有保留 Vue 反应性的对象属性的类似方法?
解决方案
哦!我搞砸了Object.assign()
。这是使用 ofObject.assign()
而不是的权利Vue.set()
:
var button = {};
button[name] = {
component,
options,
};
this.buttons = Object.assign({}, this.buttons, button);
这对我来说很好。文档在这里https://vuejs.org/v2/guide/reactivity.html#For-Objects:
// instead of `Object.assign(this.someObject, { a: 1, b: 2 })` this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
推荐阅读
- excel - 使用两个范围组合两个 SUMIF 语句
- python - Plyer 通知在 android 上不起作用
- java - Spring Cloud Config Server 是硬编码路径的有效解决方案吗?
- flutter - 颤振如何在顶部修复容器
- python - 如何在没有关闭驱动程序的情况下关闭 selenium 中的 target = _blank 页面?
- amazon-web-services - amazon-ssm-agent 在 Windows Server 2019 实例上重新启动后无法重新启动
- javascript - 使用javascript检查对角线、垂直和水平方向的一行4?
- r - 使用附加信息找到最大功能
- java - 未找到依赖项'javax:javaee-api:6.0'
- php - Elasticsearch:如何在聚合中使用多个过滤器和计算?