javascript - Vue子组件复用的props问题
ringa_lee
ringa_lee 2017-04-11 11:07:48
[JavaScript讨论组]

父组件是个列表,每一项的数据交给子组件处理逻辑.

<template>
  <p class="parent">
  <ul>
    <li v-for='item in question.content'>
      <child :data='item'></child>
    </li>
  </ul>
  <button @click='add'>添加</button>
 </p>
</template>
<script>
  //数据模板
  let temp = {
    type: 'radio',
    title: '单选题',
    options: [{
      text: '选项一'
    } ,{
      text: '选项二'
    }]
  }

export default {
  data() {
    question: {
      name: 'XXX',
      content: []
    }
  },
  methods: {
    add() {
      //不行,拷贝了但数据还是被共用了
      this.question.content.push(Object.assign({}, temp))
      //可以,数据之间没用被共用了,开辟了新内存
      this.question.content.push({
        type: 'radio',
        title: '单选题',
        options: [{
        text: '选项一'
        } ,{
        text: '选项二'
        }]
      })

    }
  }
}

第一种明明拷贝了,应该是互不影响的.难道是因为不是深拷贝?

`

ringa_lee
ringa_lee

ringa_lee

全部回复(2)
巴扎黑

是的你说对了,不是深度拷贝。

修改一下翻译。
如果源值是对对象的引用,则它仅复制该指针。

Object.assign

PHP中文网

是的,是深度拷贝的问题。

所以你应该这样来做:

this.question.content.push(JSON.parse(JSON.stringify(temp));

在 vue 开发中,这种需求是非常多的,都可以使用上面的方式来简单的实现深度复制。
更方便地,你可以把它定义到 Vue 的原型属性下,这样就实现了一个简单的 Vue 插件方法:

Vue.prototype.$plain = function (obj) {
    return JSON.parse(JSON.stringify(obj);
}

然后,你就可以在任何组件里这样来用了:

const newObj = this.$plain(boj);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号