当前位置: 首页 > 知识库问答 >
问题:

javascript - vue3中修改数组对象的中的对象属性值页面如何更新?

慕高阳
2023-05-31

问题:
我使用 pinia 进行状态管理,写法大概如下,由于我修改的是数组中某个对象下的对象的属性,数组更新后,页面无法重新渲染。

// store/index.js
export const useLayerStore = defineStore("layer", {
    state: () => {
        return {
            layerList: [],
        };
    },
         actions: {
modifyAttrs(id: string, attrs: Object) {
            const index = this.layerList.findIndex((item) => item.id === id);
            let item = Object.assign(this.layerList[index]);
            item.attrs = { ...item.attrs, ...attrs };
            item = attrsToStyle(item);
            this.layerList[index] = item;
        },
    },
});

function attrsToStyle(obj: layerItem) {
    const { x, y, width, height } = obj.attrs;
    obj.style.left = x;
    obj.style.top = y;
    obj.style.width = width;
    obj.style.height = height;
    return obj;
}
// 组件的 js
import { useLayerStore } from "@/stores/";
const layer = useLayerStore();
const { layerList } = storeToRefs(layer);
<div class="editor-component-box">
            <component
                v-for="comp in layerList"
                :key="comp.id"
                :is="comp['component']"
                class="absolute component-item"
                :class="{ 'selected-border': comp.selected }"
                :style="comp['style']"
                @click="componentHandleClick(comp.id)"
                :data-id="comp.id" />
        </div>

当我点击按钮修改元素的 x,y,width,height 某个样式值的时候,layerList 中对应的元素的下的style对象的下属性值也会更新,由于页面是根据这个对象来渲染内联样式的, style 在手动更新后一直无法更新,想请教下各位大佬这是什么原因?
数组 layerList 新增删除都是可以在页面中实时渲染出来的。

共有2个答案

谭煜
2023-05-31
modifyAttrs(id: string, attrs: Object) {
    const index = this.layerList.findIndex((item) => item.id === id);
    let item = this.layerList[index];
    item.attrs = { ...item.attrs, ...attrs };
    attrsToStyle(item);
},
彭海阳
2023-05-31

数组里更新某项直接通过索引赋值不行,vue无法监测到变化
1、通过splice函数

this.layerList.splice(index, 1, item);

2、数组重新赋值

this.layerList[index] = item;
this.layerList = [...this.layerList];
 类似资料:
  • 问题内容: 我只是阅读了watch()方法的Mozilla文档。它看起来非常有用。 但是,我找不到与Safari类似的东西。既不是Internet Explorer。 您如何管理跨浏览器的可移植性? 问题答案: 我不久前为此创建了一个小object.watch垫片。它适用于IE8,Safari,Chrome,Firefox,Opera等。

  • 如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用:

  • 我有一个类包含如下所示同伴对象。 我想在运行时修改同伴对象的属性。我将在这个类中添加数百个属性。所以我要做动态。我使用了这个方法,得到如下错误。

  • 问题内容: 给定一个JavaScript对象: 如何有效地将内部对象提取到数组中? 我不需要维护 object [n] ID 的句柄。 问题答案:

  • 我发现自己经常遇到这种模式。我有一个从api中返回的对象数组,我只需要操作所有对象中的一个属性。 有没有办法使用ES6/Babel或Typescript让该模式更具声明性? 寻找一些巧妙的破坏技巧或类似的东西。

  • 在使用一个库的时候碰到了一个很奇怪的问题,有个class实例化生成的对象,假设为A 对A的属性进行修改 打印A发现,其中的a属性并没有变,但是直接打印A.a是改变了的,请问这种情况大概会是什么原因呢,是有什么知识盲区吗,目前知道a属性是不可删除的属性,但是一般对象设置configurable=false也不会出现这种情况,如果不允许修改的话应该也会报错。。 (PS:A只是为了表述简化的例子,并不是