【问题标题】:Vue2 component somehow modifying propVue2组件以某种方式修改道具
【发布时间】:2018-08-10 13:18:58
【问题描述】:

所以我有一个 vue 组件用作编辑界面...
数据库里面有一个 jsonified 数组(不要问......我也不喜欢它),它必须采用特定格式......为了允许管理员编辑这个字符串数组而不破坏格式,我正在制作一个 vue 编辑组件,它将各个部分分解为各种文本框等...

我想有两个单独的变量 - 一个用于字符串数组的内容,一个用于他们正在更改的内容...第一个变量将在他们保存更改时更新...

我遇到的问题是,由于某种原因,当我更新其中一个变量时……不仅另一个变量发生了变化……而且道具也发生了变化……
我的印象是组件无法更改它们的道具..?

特别是,数组看起来像这样:

[
    '1',
    '2'
    ['1','2','3','4']
]

当我对子数组执行.splice() 时,变量和道具都会更新...

一些示例代码...

Laravel 刀片视图:
<editor :somearray={{ $someJsonifiedArray }}></editor>

组件道具/数据设置:

props: {
    somearray: {
        default: [],
        type: Array
    }
}

data(){
    return {
        editedArray: this.somearray,   // This is what will be saved
        wipArray: this.somearray       // This is what changes as they edit
    }
}

一些方法:

resetChanges(){
    this.wipArray = this.editedArray;
}

我可能遗漏了一些明显的东西......或者误解了事情的运作方式......

【问题讨论】:

    标签: javascript laravel-5 vuejs2 vue-component


    【解决方案1】:

    Javascript Array/Object is passed by reference, not by value!

    如果你这样做

    return {
        editedArray: this.somearray,   // This is what will be saved
        wipArray: this.somearray       // This is what changes as they edit
    }
    

    每当您编辑editedArraywipArray 时,您实际上是在编辑somearray,因为它们都引用同一个数组/对象。

    所以你必须克隆数组/对象而不是直接传递它。克隆对象的最简单方法是使用spread operator(或者在某些情况下,需要deep cloning)。克隆数组最简单的方法是使用slice

    return {
        editedArray: {...this.somearray},   // This is what will be saved
        wipArray: {...this.somearray}       // This is what changes as they edit
    }
    

    【讨论】:

    • 啊哈。我实际上记得上个月在某处读过数组是通过引用传递的>.> ...我现在非常努力...我添加了.slice()...到目前为止它似乎正在工作...如果我遇到任何问题,我会回复,否则我会在测试后将其视为已接受。非常感谢您的快速信息回复
    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 2021-11-24
    • 2021-08-25
    • 1970-01-01
    • 2013-06-09
    • 2017-11-11
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多