在 vue.js 的 child 组件中创建传递的道具的本地副本?

Creating local copy of passed props in child component in vue.js?

在 vue.js 中,在不更改 parent 数据的情况下编辑道具的正确方法是什么? 我的意思是,每当我们将任何 属性 从 parent 传递到 vue.js 中的 child 时,如果我们对 [=52 中的 属性 进行任何更改=] 组件然后更改也反映在 parent 的组件中。

在 vue.js 中是否有任何方法可以在 child 中制作已通过的 属性 的本地副本?

我用谷歌搜索了这个,但到处都写着我们可以通过这样做来实现。

 props:["user"],
  data(){
    return {
      localUser: Object.assign({}, this.user)
    }
  }

此处向用户传递了一个 object,我正在本地用户中创建它的副本,但它根本不起作用,本地用户未定义。

您是否遇到过这样的情况,您必须在 child 组件中更改 parent 属性 而不影响 parent 组件的状态,即 -在 child 中制作自己的副本然后编辑它?

对此的任何见解都会有所帮助。

我也看过某处,在vue@2.3.3中,当我们想从Father传递一个prop到Child组件时,我们需要手动创建一个本地数据来保存prop,即做了很多无用的作品。

我们可以像这样手动创建本地数据:

props: ['initialCounter'],
data: function () {
    return { counter: this.initialCounter }
}

但这也不适用于我的情况。 我正在使用 vue cli 3.0.1 进行开发。

这是我的代码。

在我的应用程序中,我有一个列表视图。

当用户点击 See Focused View 按钮时,用户将被重定向到下面提到的视图,即实际上是一个 bootstrap - 模态视图。

在这里用户可以编辑名称的值,但是因为我在这里将名称作为 属性 从一个组件传递,所以在这里编辑它会导致它在 parent 组件上更新,即在列表视图也是如此。

在您的 fiddle, the child component is using Object.assign() to create a copy of data, which is an array of objects. However, this only creates a shallow copy 中,数组元素仍将引用原始实例,从而导致您所看到的行为。

深拷贝数组的几种解决方法:

  • 使用 JSON.parse(JSON.stringify(this.data)), which works reasonably well for primitive 对象属性(StringNumberBigIntBooleanundefinednull):

    data() {
      return {
        local_data: JSON.parse(JSON.stringify(this.data))
      }
    }
    

    (demo 1)

  • 将对象映射成新对象,如果深度只有1,效果很好(嵌套arrays/objects仍然会被浅复制):

    data() {
      return {
        local_data: this.data.map(x => ({...x}))
      }
    }
    

    (demo 2)

  • 使用实用程序库,例如 lodashcloneDeep:

    data() {
      return {
        local_data: _.cloneDeep(this.data)
      }
    }
    

    (demo 3)