「Vue面试题」动态给vue的data添加一个新的属性时会发生什么?怎样去解决的?_vue给标签元素添加data-属性

文章介绍了Vue中如何处理动态添加响应式属性的问题,提供了Vue.set(),Object.assign()和$forceUpdate等方法来确保数据与视图的同步更新。重点讲述了Vue.set的原理和使用,以及为何不能直接在已创建实例上添加响应式属性的原因。
摘要由CSDN通过智能技术生成
        console.log(`get foo:${val}`);
        return val
    },
    set(newVal) {
        if (newVal !== val) {
            console.log(`set foo:${newVal}`);
            val = newVal
        }
    }
})

}


当我们访问`foo`属性或者设置`foo`值的时候都能够触发`setter`与`getter`



obj.foo
obj.foo = ‘new’


但是我们为`obj`添加新属性的时候,却无法触发事件属性的拦截



obj.bar = ‘新属性’


原因是一开始`obj`的`foo`属性被设成了响应式数据,而`bar`是后面新增的属性,并没有通过`Object.defineProperty`设置成响应式数据


### 三、解决方案


`Vue` 不允许在已经创建的实例上动态添加新的响应式属性


若想实现数据与视图同步更新,可采取下面三种解决方案:


* Vue.set()
* Object.assign()
* $forcecUpdated()


#### Vue.set()


Vue.set( target, propertyName/index, value )


参数


* `{Object | Array} target`
* `{string | number} propertyName/index`
* `{any} value`


返回值:设置的值


通过`Vue.set`向响应式对象中添加一个`property`,并确保这个新 `property` 同样是响应式的,且触发视图更新


关于`Vue.set`源码(省略了很多与本节不相关的代码)


源码位置:`src\core\observer\index.js`



function set (target: Array | Object, key: any, val: any): any {

defineReactive(ob.value, key, val)
ob.dep.notify()
return val
}


这里无非再次调用`defineReactive`方法,实现新增属性的响应式


关于`defineReactive`方法,内部还是通过`Object.defineProperty`实现属性拦截


大致代码如下:



function defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
get() {
console.log(get ${key}:${val});
return val
},
set(newVal) {
if (newVal !== val) {
console.log(set ${key}:${newVal});
val = newVal
}
}
})
}


#### Object.assign()


直接使用`Object.assign()`添加到对象的新属性不会触发更新


应创建一个新的对象,合并原对象和混入对象的属性



this.someObject = Object.assign({},this.someObject,{newProperty1:1,newProperty2:2 …})


#### $forceUpdate


如果你发现你自己需要在 `Vue` 中做一次强制更新,99.9% 的情况,是你在某个地方做错了事


`$forceUpdate`迫使 `Vue` 实例重新渲染


PS:仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。


#### 小结



### 最后

编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

![名不虚传!字节技术官甩出的"保姆级"数据结构与算法笔记太香了](https://img-blog.csdnimg.cn/img_convert/a3e940acdcd55765852a8bfe54482664.png)



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值