Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

微信公众号:前端程序猿之路
关注可了解更多的前端知识,反馈问题或建议,请公众号留言。
如果你觉得公众号内容对你有帮助,欢迎关注并转载

vue开发过程中,父组件通过props传值给子组件,子组件在页面展示父组件的值,在操作子组件值以后,即使不点击确定按钮,父组件中的值也发生了变化,但是需求是操作子组件数据以后,必须点击’确定’按钮以后才能修改父组件的值,否则父组件和子组件的值都不可以变化。
为了解决这一问题,当父组件传值给子组件以后,我通过
JSON.parse(JSON.stringify(data ))将父组件的数据进行拷贝,然后赋值给子组件中this.targetdData,子组件操作也是改变的this.targetData的值,而不会改变父组件的值,当点击‘’确定‘’按钮时,通过$emit调用父组件中的函数,将修改后的this.targetData值给了父组件,修改父组件中的值,当再次进入子组件的时候,会重新把修改后的值拷贝给子组件进行展示就可以解决上述问题了。
拷贝父组件的值:

this.targetData = JSON.parse(JSON.stringify(this.targetDataPar))

调用父组件方法

this.$emit('changeData', this.targetData)
changeData(val) {
            this.targetChanged = val;
      },

子组件拷贝父组件可用以下方式:

  1. JSON.parse(JSON.stringify(data ))
  2. Object.assign方法用于对象的合并,将源对象的所有可枚举属性,复制到目标对象
    解释:
const target = { a: 1 };
        const source1 = { b: 2 };const source2 = { c: 3 };
        Object.assign(target, source1, source2);
        target // {a:1, b:2, c:3}
    Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。
    注意:
    Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

const obj1 = {a: {b: 1}};const obj2 = Object.assign({}, obj1);
obj1.a.b = 2;
obj2.a.b // 2

参考链接:https://www.jianshu.com/p/d5f572dd3776
可参考深入理解JavaScript的深拷贝和浅拷贝:
https://www.cnblogs.com/dinghuihua/p/6674719.html

欢迎关注公众号,有你想要的前端知识:
在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
Vue 2中,父子组件之间的数据传递是双向的,主要通过props(属性)和$emit(事件)来实现。以下是一些常见的父子组件传值方法: 1. **Props(属性)**: - **单向数据流**:组件组件传递数据使用`props`。组件定义props时,需要指定类型,组件通过`props`接收数据。例如: ```javascript // 组件 <child-component :value="parentValue" /> // 组件 props: { value: { type: String, default: '' } } ``` 组件只能读取props,不能修改,除非组件通过$emit触发自定义事件。 2. **自定义事件($emit)**: - **父子组件间的双向通信**:如果需要组件组件发送更新,可以使用$emit触发一个自定义事件,如: ```javascript // 组件 this.$emit('update-value', newValue); // 组件 <child-component @update-value="handleChildValueChange" /> methods: { handleChildValueChange(value) { this.parentValue = value; } } ``` 3. **引用类型(Object/Array)**: - 如果组件想传递对象或数组,Vue默认浅复制。若需要深拷贝,需在组件中处理,例如使用`Vue.extend`或`JSON.parse(JSON.stringify())`。 4. **自定义指令(v-bind、v-on)**: - 可以使用自定义指令如`v-model`在组件间共享数据,但这在Vue 2中不是推荐的做法,因为可能带来性能问题。 5. **$parent/$children/$refs**: - 有时可能需要直接访问组件组件的实例,这时可以使用`$parent`、`$children`和`$refs`。但这些选项通常不鼓励滥用,因为它们破坏了组件的封装性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值