vue中使data中的数据初始化

组件中的根元素使用了v-if,但是组件中的data数据不会初始化,因为不是组件使用了v-if,组件不会销毁;但是可是使用以下方式来让data数据初始化:

Object.assign(this.$data, this.$options.data())

this.$data:当前的data数据(修改过后的);
this.$options.data():初始化的data数据;
Object.assign的作用就是把this.$options.data()的值赋值给this.$data;
下面详细说说Object.assign的用法:

ES6的官方文档的解释是:Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象

  1. 当源对象的属性和目标对象的属性一样时,直接把源对象的属性值赋值给目标对象的属性;
let target = {
  aaa: 18,
  bbb: '张三'
}
let source = {
  aaa: 12,
  bbb: '李四'
}
let newObj = Object.assign(target, source)
console.log(newObj, target == newObj); // {aaa: 12, bbb: '李四'} true
  1. 当源对象的属性和目标对象的属性不一致时,会把源对象的所有属性拿出来,如果目标对象中有该属性,则直接把属性值赋值,如果没有,则把属性和属性值都添加到目标对象;
let target = {
  aaa: 18,
  bbb: '张三'
}
let source = {
  aaa: 12,
  bbb: '李四',
  ddd: true
}
let newObj = Object.assign(target, source)
console.log(newObj, target == newObj); // {aaa: 12, bbb: '李四', ddd: true} true

需要注意的是,Object.assign遇到属性是一个对象或者数组的(引用类型的数据),会直接把引用地址赋值:

let target = {
  aaa: 18,
  bbb: {
    ccc: 18
  }
}
let source = {
  aaa: 12,
  bbb: {
    ddd: 18
  }
}
let newObj = Object.assign(target, source)
console.log(newObj, target == newObj); // {aaa: 12, bbb: {ddd: 18}} true

手写一个简易版的Object.assign:

let target = {
  aaa: 18,
  bbb: {
    ccc: 11
  }
}
let source = {
  aaa: 11,
  name: '张三',
  bbb: {
    ddd: 88
  }
}
let source1 = {
  eee: '李四'
}
let myAssign = (target, ...source) => {
  source.forEach(item => {
    let sourceKeys = Object.keys(item)
    sourceKeys.forEach(keyItem => {
      target[keyItem] = item[keyItem]
    });
  })
  return target
}
Object.prototype.myAssign = myAssign
let newObj = Object.myAssign(target, source, source1)
console.log(">>>>", newObj);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值