vue中created、watch和computed的执行顺序详解

yizhihongxing

请看下面的攻略。

Vue中created、watch和computed的执行顺序详解

在Vue中,我们可以使用created、watch和computed来响应数据的变化,但是它们的执行顺序可能会导致一些意想不到的问题。下面我将详细讲解它们的执行顺序。

1. created的执行顺序

当一个Vue实例被创建时,created钩子函数会立即被调用。在created阶段,该实例已经完成了数据观测,也已经设置了计算属性、观察者、事件和watch等。我们可以在该阶段访问数据,但是DOM尚未完成编译,因此无法访问DOM元素。

下面的代码展示了一个简单的示例,它演示了created的执行顺序:

new Vue({
  data() {
    return {
      count: 0
    }
  },
  created() {
    console.log('我是created钩子函数')
    console.log('count值为:', this.count)
  }
})

输出结果如下:

我是created钩子函数
count值为: 0

2. watch的执行顺序

watch选项用于观察Vue实例的数据变动。当数据发生变化时,watch会自动触发回调函数,让我们可以进行特定的处理。在Vue实例创建后,watch选项会被先于created钩子函数执行。

下面的代码展示了一个简单的示例,它演示了watch的执行顺序:

new Vue({
  data() {
    return {
      count: 0
    }
  },
  watch: {
    count(newValue, oldValue) {
      console.log('count一旦发生变化,我就会被触发')
      console.log('新值:', newValue, '旧值:', oldValue)
    }
  },
  created() {
    console.log('created钩子函数执行完毕')
  }
})

输出结果如下:

count一旦发生变化,我就会被触发
新值: 1 旧值: 0
created钩子函数执行完毕

我们可以看到,当count发生变化时,先执行了watch选项,后执行了created钩子函数。

3. computed的执行顺序

computed属性是计算属性,它会根据现有的数据计算出一个结果,并将其缓存起来。只有在计算属性依赖的数据发生变化时,计算属性才会重新计算。在Vue实例创建后,computed属性会先于created钩子函数执行。

下面的代码展示了一个简单的示例,它演示了computed的执行顺序:

new Vue({
  data() {
    return {
      count: 0
    }
  },
  computed: {
    message() {
      return `count的值是:${this.count}`
    }
  },
  created() {
    console.log('created钩子函数执行完毕')
    console.log('计算属性的值:', this.message)
  },
  watch: {
    count(newValue, oldValue) {
      console.log(`count发生变化:${oldValue} => ${newValue}`)
    }
  }
})

输出结果如下:

created钩子函数执行完毕
计算属性的值: count的值是:0

我们可以看到,在created钩子函数执行的时候,计算属性的值已经被缓存起来了。只有在count发生变化时,计算属性才会重新计算。

4. 通过示例进一步理解执行顺序

下面的代码展示了一个比较复杂的示例,它可以让我们更好地理解Vue中created、watch和computed的执行顺序:

new Vue({
  data() {
    return {
      count: 0,
      message: ''
    }
  },
  watch: {
    count(newValue, oldValue) {
      console.log(`count发生变化:${oldValue} => ${newValue}`)
      this.message = `count的新值为:${newValue}`
    }
  },
  computed: {
    showCount() {
      console.log('计算属性showCount被计算了')
      return this.count * 2
    }
  },
  created() {
    console.log('created钩子函数执行完毕')
    console.log('计算属性的值:', this.showCount)
    console.log('初始message:', this.message)
    this.count++
  }
})

输出结果如下:

计算属性showCount被计算了
created钩子函数执行完毕
计算属性的值: 0
初始message: 
count发生变化:0 => 1
计算属性showCount被计算了

我们可以看到,当Vue实例创建时,先执行了computed属性的计算,然后执行了created钩子函数。在created钩子函数中,我们将count的值增加了1,这导致了count的watcher被触发。该watcher将message的值更新为count的新值为:1。这时候,计算属性showCount又被重新计算了一次,最后的值为2。

最后再次提醒一下,虽然Vue生命周期中各种钩子函数的执行顺序是固定的,但是不同Vue版本的执行顺序可能会有差异,也取决于具体业务代码的编写。因此,在编写Vue代码时,请务必测试代码以了解它是如何执行的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue中created、watch和computed的执行顺序详解 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • vue-router中的钩子函数和执行顺序说明

    让我们详细讲解一下vue-router中的钩子函数和执行顺序说明。 路由钩子函数 路由钩子函数是在路由状态发生变化时执行的一些函数,可以用来控制路由的行为。 全局钩子函数 全局钩子函数分别有: beforeEach: 在进入路由之前执行,可以用来做一些导航守卫 afterEach: 在进入路由之后执行,可以用来做一些后续处理 beforeResolve: 在…

    Vue 2023年5月28日
    00
  • Vue监听数组变化源码解析

    Vue 监听数组变化是通过 Object.defineProperty() API 实现的,具体实现代码在 Vue 的源码中可以在 core/observer/array.js 文件中找到。 具体来说,当我们使用 Vue 的时候,如果我们使用了数组的方法,比如 push()、splice() 等,在内部会调用 _ob__.observeArray(array…

    Vue 2023年5月29日
    00
  • Vue.set 全局操作简单示例

    Vue.set()方法是Vue.js提供的全局操作,用于给Vue实例动态添加属性,并保证新添加的属性能够响应式地触发视图更新。以下是一个关于Vue.set()的攻略: 简介 Vue.set()的语法如下: Vue.set(object, key, value) 其中: object:Vue实例的一个数据对象 key:新添加的键 value:新添加的键对应的值…

    Vue 2023年5月27日
    00
  • Vue 图片压缩并上传至服务器功能

    下面是 Vue 图片压缩并上传至服务器的完整攻略。 1. 安装必要的库和工具 在使用 Vue 图片压缩并上传至服务器功能之前,需要确保已经安装以下必要的库和工具: vue: Vue.js 框架 axios: HTTP 请求库 compressorjs: 图片压缩库,用来将图片压缩至指定的大小 qs: Querystring 库,用来序列化表单数据 multe…

    Vue 2023年5月27日
    00
  • vue双向数据绑定知识点总结

    Vue双向数据绑定知识点总结 什么是双向数据绑定 双向数据绑定是指当数据模型(Model)发生变化时,会自动将变化的数据反映到视图(View)中,同时当用户操作视图时,数据模型也会相应地发生改变。这种自动的双向同步,可以减少开发者手动维护数据和视图之间的关系,提升代码的开发效率。 Vue的双向数据绑定 Vue框架实现了双向数据绑定的机制,通过Vue的数据绑定…

    Vue 2023年5月28日
    00
  • 使用vue打包时vendor文件过大或者是app.js文件很大的问题

    处理vue打包时vendor文件过大或者是app.js文件很大的问题可以通过以下方法进行: 1. 使用动态导入 (Dynamic Import) 动态导入是Vue.js 2.6版本开始提供的一个特性,可以让你在运行时(runtime)条件下去组织代码切割,从而减小打包体积。它是通过 import() 语法实现的。使用动态导入可以减少app.js的大小,提高页…

    Vue 2023年5月28日
    00
  • Vue获取页面元素的相对位置的方法示例

    下面是详细讲解“Vue获取页面元素的相对位置的方法示例”的攻略: 1. 介绍 在前端开发中,有时需要获取页面元素相对于整个页面的位置坐标,以便实现一些操作和效果。本文将介绍在Vue中获取页面元素相对位置的方法及其示例。 2. 方法 在Vue中,可以通过 ref 属性来引用页面元素,并通过 this.$refs 获取对其的引用。获取到元素后,可以使用 getB…

    Vue 2023年5月29日
    00
  • 使用vue-router在Vue页面之间传递数据的方法

    下面为你详细讲解使用vue-router在Vue页面之间传递数据的方法: 1. 使用props传递数据 我们可以通过在组件之间传递props来实现数据的传递,由于vue-router本质上是一个路由组件,因此我们可以使用props在路由之间传递数据。 1.1 在路由中定义props 我们可以通过在路由中定义props来让vue-router接收传递过来的数据…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部