mouted能不能访问data中的数据_Vue各阶段数据可使用情况:created,computed,data,prop,mounted,methods,watch...

本文详细解析Vue实例的生命周期,重点讨论created、mounted、computed等阶段数据的使用情况。探讨了computed作为属性调用的特性,以及其缓存功能如何避免不必要的计算。同时,对比了computed和methods在性能及应用场景上的差异,并介绍了watch的适用场合。
摘要由CSDN通过智能技术生成

created时,可用data和prop中的数据。

computed的属性,当在mounted或者dom中使用到时,才会属性的执行代码。

最后是mouted,可使用前面的数据,并且此时才可以操作dom。

watch不会再创建阶段自动执行,除了添加立即执行这个配置项。

加载顺序:

f689ac2d678dd591e63a1670d0216824.png

在官方文档中,强调了computed区别于method最重要的两点

computed是属性调用,而methods是函数调用

computed带有缓存功能,而methods不是

计算属性是基于它们的依赖进行缓存的,只有在它的相关依赖发生改变时才会重新求值。

let vm = new Vue({

el: '#app',

data: {

message: '我是消息,'

},

methods: {

methodTest() {

return this.message + '现在我用的是methods'

}

},

computed: {

computedTest() {

return this.message + '现在我用的是computed'

}

}

})

复制代码

这就意味着只要 message 还没有发生改变,多次访问 computedTest计算属性会立即返回之前的计算结果,而不必再次执行函数。

相比而言,只要发生重新渲染,method 调用总会执行该函数。

{{message}}

{{methodTest}}

{{methodTest()}}

{{methodTest()}}

{{methodTest()}}

{{computedTest}}

{{computedTest}}

复制代码

在HTML的插值里

computed定义的方法我们是以属性访问的形式调用的,{{computedTest}}

但是methods定义的方法,我们必须要加上()来调用,如{{methodTest()}},否则,视图会出现test1的情况,见下图

b2cb1f3870fba5d3471c380a2ba3239c.png

computed的缓存功能

在上面的例子中,methods定义的方法是以函数调用的形式来访问的,那么test2-1,test2-2,test2-3是反复地将methodTest方法运行了三遍,如果我们碰到一个场景,需要1000个methodTest的返回值,那么毫无疑问,这势必造成大量的浪费

更恐怖的是,如果你更改了message的值,那么这1000个methodTest方法每一个又会重新计算。。。。

所以,官方文档才反复强调对于任何复杂逻辑,你都应当使用计算属性

computed依赖于data中的数据,只有在它的相关依赖数据发生改变时才会重新求值

let vm = new Vue({

el: '#app',

data: {

message: '我是消息,'

},

methods: {

methodTest() {

return this.message + '现在我用的是methods'

}

},

computed: {

computedTest() {

return this.message + '现在我用的是computed'

}

}

})

复制代码

如上例,在Vue实例化的时候,computed定义computedTest方法会做一次计算,返回一个值,在随后的代码编写中,只要computedTest方法依赖的message数据不发生改变,computedTest方法是不会重新计算的,也就是说test3-1,test3-2是直接拿到了返回值,而非是computedTest方法重新计算的结果。

这样的好处也是显而易见的,同样的,如果我们碰到一个场景,需要1000个computedTest的返回值,那么毫无疑问,这相对于methods而言,将大大地节约内存

哪怕你改变了message的值,computedTest也只会计算一次而已

computed的其它说明

computed其实是既可以当做属性访问也可以当做方法访问

computed的由来有一个重要原因,就是防止文本插值中逻辑过重,导致不易维护

computed和watch

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:watch 属性,在路由场景有使用:vue学习之router

当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch,更好的想法是使用 computed 属性而不是命令式的 watch 回调:

{{ fullName }}

复制代码var vm = new Vue({

el: '#demo',

data: {

firstName: 'Foo',

lastName: 'Bar',

fullName: 'Foo Bar'

},

watch: {

firstName: function (val) {

this.fullName = val + ' ' + this.lastName

},

lastName: function (val) {

this.fullName = this.firstName + ' ' + val

}

}

})

复制代码

上面代码是命令式的和重复的。将它与 computed 属性的版本进行比较:

var vm = new Vue({

el: '#demo',

data: {

firstName: 'Foo',

lastName: 'Bar'

},

computed: {

fullName: function () {

return this.firstName + ' ' + this.lastName

}

}

})

复制代码

当需要在数据变化时执行异步或开销较大的操作时,使用watch比较合适。

总之:尽量用computed计算属性来监视数据的变化,因为它本身就这个特性,用watch没有computed“自动”,手动设置使代码变复杂。

Vue中的computed是在生命周期的哪个阶段执行的?

1.在new Vue()的时候,vue\src\core\instance\index.js里面的_init()初始化各个功能

function Vue (options) {

if (process.env.NODE_ENV !== 'production' &&

!(this instanceof Vue)

) {

warn('Vue is a constructor and should be called with the `new` keyword')

}

this._init(options) //初始化各个功能

}

复制代码

2.在_init()中有这样的一个执行顺序:其中initState()是在beforeCreate和created之间

initLifecycle(vm)

initEvents(vm)

initRender(vm)

callHook(vm, 'beforeCreate')

initInjections(vm) // resolve injections before data/props

initState(vm) //初始化

initProvide(vm) // resolve provide after data/props

callHook(vm, 'created')

复制代码

3.在initState()做了这些事情:

if (opts.props) initProps(vm, opts.props)//初始化Props

if (opts.methods) initMethods(vm, opts.methods)//初始化methods

if (opts.data) {

initData(vm)} else {

observe(vm._data = {}, true /* asRootData */)}//初始化data

if (opts.computed) initComputed(vm, opts.computed)//初始化computed

复制代码

4.所以Props,methods,data和computed的初始化都是在beforeCreated和created之间完成的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值