vue实例的data属性,哪个生命周期中获取不到

vue实例的data属性,哪个生命周期中获取不到,第1张

vue实例的data属性beforeCreate生命周期中获取不到。根据查询相关资料信息显示,Vue实例的data属性可以在created、beforeMount、mounted生命周期中获取到,beforeCreate生命周期中获取不到。

在讲这个之前,首先要明白一点,这个所谓的响应式,其实本身就是对 MVVM 的理解。

MVVM 其实就是所谓的 Modal View ViewModal 。

简单理解,就是你的 data 中的数据,和 template 模板中的界面,本身就是两个东西。

但是, Vue 给你做了一层中间的 ViewModal ,让视图上的改变能反映到 data 中, data 中的改变能反映到视图上。

在这个反映过程中,ViewModal就是视图和数据的一个桥梁。

同样是让 a + 1 。

在 Vue 中,这个桥梁是你看不见的,因为 Vue 都帮你完成了视图和数据的变化传递。

而 React 就是侵入式的,因为要显式地声明 setState ,通过它,来设置变量的同时,设置视图的改变。

所以,所谓的侵入式,其实就是对于桥梁的侵入。

所以, Vue 的神奇之处就在于,不需要我们手动地显示调用 setState ,也就是这个桥梁, Vue 已经帮我们桥接上了。

要让 data 改变的同时,视图也发生改变,所以,问题的所在,就是我们需要监听,什么时候,这个变量发生了变量。

然而, ES5 中,就有那么一个特性,可以做到对于数据的劫持(监听)。

它就是 ObjectdefineProperty 。

ObjectdefineProperty( obj, prop, descriptor ) 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象,与此同时,它可以对 对象的一些额外底层的属性进行设置 。例如可以设置 writable , enumerable , configurable 等属性。

后面的额外属性设置,才是我们使用它的重点。

但是,我们使用的不是上面的几个属性,最主要的还是它的 get set ,可以对属性值的获取和设置 *** 作进行拦截。

get主要是可以对值的获取进行拦截,,它必须要传入一个 return ,并且, 该函数的返回值会被用作属性的值 。我们可以来看一个例子:

由于设置了 get ,所以,输出 aname 的时候直接会被拦截,走 get() 中的 return 所以,此时, aname 的值应该是 你已经被拦截了!。

set主要是可以对值的设置进行拦截,该方法会接受一个参数,那就是 被赋予的新值 。我们可以来看一个例子:

由于设置了 set ,所以,设置值的时候会被拦截,走 set() 中的方法。

所以, Vue 能自动获取data中的改变,反映到视图的原因,就是有对于变量的获取和设置的劫持,当变量发生改变的同时, Vue 能在第一时间知道,并且对视图做出相应的改变 *** 作。

而这把钥匙就是 ObjectdefineProperty 。

尚硅谷Vue源码解析之数据响应式原理

ObjectdefineProperty() - MDN

getmap()是异步的,其实你在输出position时也是没有值的,是getmap返回后填上的值

那为什么position没显示undefined呢?

console里的object只保留了一份,也就是常说的引用,赋值后就把undefined更新覆盖了。

在输出city时没有这个属性,就是一个undefined值,也就没法更新了

可以做个简单的例子试一下:

var a = {};

consolelog(a);

acity = "北京";

computed是Vue实例中的一个属性对象。

在computed中,可以定义一些属性,这些属性,叫做计算属性。计算属性的本质就是一个方法,只不过,我们在使用这些计算属性的时候,是把它们的名称,直接当做属性来使用,并不会把计算属性当做方法来使用。

三个注意事项:

一、计算属性在引用的时候,一定不要加()去调用,直接把它当作普通的属性去使用就好了;

二、只要计算属性这个function内部所用到的data中的数据发生了变化,就会立即重新计算这个计算属性的值;

三、计算属性的求值结果,会被缓存起来,方便下次继续使用;如果计算属性方法中,所依赖的任何数据,都没有发生过变化,则不会重新对计算属性求值。

子组件通过this$emit('update:属性名',属性值)修改父组件的值

使用sync方法获取修改后属性

子组件在传值的时候,选用input,如this$emit(‘input’,val),在父组件直接用v-model绑定,就可以获取到了

子组件的this$emit('change', orgCode)会触发父组件change事件

在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。

这是为什么呢?

让我们来看官方文档是怎么写的:

受现代 JavaScript 的限制(以及废弃 Objectobserve),Vue 不能检测到对象属性的添加或删除。由于 Vue会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue

转换它,这样才能让它是响应的。 例如:

我们首先在浏览器中查看 consolelog(thisobj); 这句话的打印结果:

可以看出ValueA属性是有get 和 set方法的,而新增的ValueB属性是没有的。

让我们来触发三次增加ValueA的函数,网页打印结果如下:

同时页面上的显示情况:

由此看出,更新ValueA时,数据与视图会同步更新,而更新ValueB的时候数据会被更新而视图却不会被更新

解决方案

官方定义:

Vue 不允许在已经创建的实例上动态添加新的根级响应式属性 (root-level reactive property)。然而它可以使用 Vueset(object, key, value) 方法将响应属性添加到嵌套的对象上:

Vueset(dataobj, 'key', value)

您还可以使用 vm$set 实例方法,这也是全局 Vueset 方法的别名:

this$set(thisobj,'e',02)

上述实例解决如下:

再分别触发增加ValueA和ValueB的函数,视图与数据都进行了更新:

以上就是关于vue实例的data属性,哪个生命周期中获取不到全部的内容,包括:vue实例的data属性,哪个生命周期中获取不到、【手把手教你搓Vue响应式原理】(一)初识Vue响应式、vue获取用户经纬度的问题得到对象,但是拿到不了对象属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9588651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存