Vue中计算属性和监听属性及数据的响应式更新和依赖收集基本原理讲解

 更新时间:2023年03月25日 10:18:53   作者:袁代码  
computed是vue的配置选项,它的值是一个对象,其中可定义多个计算属性,每个计算属性就是一个函数,下面这篇文章主要给大家介绍了关于vue中计算属性computed的详细讲解,需要的朋友可以参考下

Vue是一款非常流行的JavaScript框架,它提供了很多方便的功能来帮助开发者快速构建交互式Web应用程序。其中两个非常重要的功能是计算属性和监听属性,以及Vue的数据响应式更新和依赖收集机制。

计算属性和监听属性

在Vue中,我们可以使用计算属性和监听属性来处理一些复杂的逻辑,从而让我们的代码更加简洁明了。

计算属性

计算属性本质上就是一个函数,它的返回值会被缓存起来,只有当依赖的数据发生变化时才会重新计算。这个特性使得我们可以将一些复杂的计算逻辑放到计算属性中,从而避免重复计算和代码冗余。

例如,假设我们有一个数组,我们需要对这个数组进行过滤和排序,然后再返回一个新的数组。我们可以使用计算属性来实现这个功能,代码如下:

<template>
  <div>
    <ul>
      <li v-for="item in sortedItems">{{ item }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      items: [3, 1, 2, 5, 4]
    }
  },
  computed: {
    sortedItems() {
      return this.items.filter(item => item % 2 === 0).sort()
    }
  }
}
</script>

在这个例子中,我们定义了一个items数组,并且在计算属性sortedItems中对它进行了过滤和排序。在模板中,我们直接使用sortedItems来展示数据,而不需要在模板中编写复杂的过滤和排序逻辑。

监听属性

监听属性用于监听某个数据的变化,当这个数据变化时,可以执行一些特定的逻辑。例如,我们可以监听用户输入的关键字,然后根据关键字去请求数据。

在Vue中,我们可以使用watch选项来定义一个监听属性。下面是一个例子:

<template>
  <div>
    <input v-model="keyword" placeholder="请输入关键字">
    <ul>
      <li v-for="item in filteredItems">{{ item }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      items: ['apple', 'banana', 'orange'],
      keyword: ''
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => item.includes(this.keyword))
    }
  },
  watch: {
    keyword(newVal, oldVal) {
      console.log(`关键字从${oldVal}变为${newVal}`)
    }
  }
}
</script>

在这个例子中,我们定义了一个keyword变量,用于存储用户输入的关键字。在computed中,我们定义了一个filteredItems计算属性,用于根据关键字过滤数据。在watch中,我们监听了keyword变量的变化,并在控制台输出了变化的信息。

数据的响应式更新和依赖收集

Vue的一个非常重要的特性是数据的响应式更新和依赖收集机制。这个机制使得我们可以在数据发生变化时,自动更新视图,而不需要手动操作DOM。

响应式更新

在Vue中,我们可以使用data选项来定义组件的数据。当我们改变data中的某个属性的值时,Vue会自动更新视图中对应的部分。例如,下面是一个简单的例子:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="changeMessage">改变消息</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello, world!'
    }
  },
  methods: {
    changeMessage() {
      this.message = 'Hello, Vue!'
      }
  }
}
</script>

在这个例子中,我们定义了一个message变量,并在模板中展示它的值。当用户点击按钮时,我们调用changeMessage方法来改变message的值。由于message是响应式的,所以当它的值发生变化时,视图会自动更新。

依赖收集

Vue是如何实现响应式更新的呢?其实,Vue会在组件渲染时,自动追踪数据的依赖关系,并建立一个依赖收集的关系图。当数据发生变化时,Vue会遍历这个依赖关系图,找到所有依赖这个数据的组件,并触发它们的重新渲染。

例如,假设我们有一个组件,它的模板中使用了message变量:

<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>
<script>
export default {
  props: ['message']
}
</script>

在这个例子中,我们定义了一个message属性,并在模板中展示它的值。当这个组件被渲染时,Vue会自动将这个组件与message变量建立一个依赖关系。当message变量发生变化时,Vue会自动找到所有依赖它的组件,并触发它们的重新渲染。

需要注意的是,Vue只会追踪在模板中使用的数据的依赖关系,如果某个数据没有在模板中使用过,那么它的变化也不会触发视图的更新。

总结

计算属性和监听属性是Vue中非常常用的两个功能,它们可以帮助我们处理一些复杂的逻辑,使得代码更加简洁明了。数据的响应式更新和依赖收集机制是Vue的核心特性之一,它使得我们可以在数据发生变化时,自动更新视图,而不需要手动操作DOM。这个机制的实现是通过Vue的响应式系统来实现的,它会在组件渲染时自动追踪数据的依赖关系,并建立一个依赖收集的关系图。当数据发生变化时,Vue会遍历这个依赖关系图,找到所有依赖这个数据的组件,并触发它们的重新渲染。

需要注意的是,由于Vue的响应式系统是基于ES5的Object.defineProperty实现的,所以它只能监听对象的属性访问和赋值操作,而不能监听数组的变化。如果需要监听数组的变化,可以使用Vue提供的数组变异方法,例如pushpopshiftunshiftsplicesortreverse,或者使用Vue提供的数组方法,例如Vue.setVue.delete

以上就是关于Vue的计算属性和监听属性,以及数据的响应式更新和依赖收集的详细讲解。

到此这篇关于Vue中计算属性和监听属性及数据的响应式更新和依赖收集基本原理讲解的文章就介绍到这了,更多相关Vue计算属性和监听属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决ant design vue中树形控件defaultExpandAll设置无效的问题

    解决ant design vue中树形控件defaultExpandAll设置无效的问题

    这篇文章主要介绍了解决ant design vue中树形控件defaultExpandAll设置无效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 基于Vue和ECharts实现定时更新与倒计时功能的实战分享

    基于Vue和ECharts实现定时更新与倒计时功能的实战分享

    在前端开发中,动态数据展示和用户交互是构建现代 Web 应用的核心需求之一,在本篇博客中,我们将通过一个简单的案例,展示如何在 Vue 中结合 ECharts 实现一个定时更新和倒计时功能,用于实时监控和数据可视化,需要的朋友可以参考下
    2025-01-01
  • vue框架render方法如何替换template

    vue框架render方法如何替换template

    这篇文章主要介绍了vue框架render方法如何替换template,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue3 - setup script的使用体验分享

    Vue3 - setup script的使用体验分享

    Vue3中的setup一种是setup函数,一种是script setup,这篇文章主要给大家介绍了关于Vue3 - setup script使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • vue中使用svg-icon遇到的坑及解决

    vue中使用svg-icon遇到的坑及解决

    这篇文章主要介绍了vue中使用svg-icon遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Vue Form表单的使用方法(rules格式校验网络校验键盘按键监听)

    Vue Form表单的使用方法(rules格式校验网络校验键盘按键监听)

    本文介绍了在Vue.js中使用表单校验规则(rules)进行网络请求校验的方法,以及如何通过formRef引用表单对象并进行键盘按键监听,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Vue中的百度地图定位BMap.GeolocationControl的用法

    Vue中的百度地图定位BMap.GeolocationControl的用法

    BMap.GeolocationControl 是百度地图API中的一个类,用于添加地理定位控件到地图上,以便用户可以通过该控件获取自己的当前位置,本文给大家介绍Vue中的百度地图定位BMap.GeolocationControl的用法,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Element-ui DatePicker日期选择器基础用法示例

    Element-ui DatePicker日期选择器基础用法示例

    这篇文章主要为大家介绍了Element-ui DatePicker日期选择器基础用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 使用Vue3和Vite实现对低版本浏览器的兼容

    使用Vue3和Vite实现对低版本浏览器的兼容

    在使用Vite和Vue3构建的JavaScript项目中,确保对低版本浏览器的兼容性是一个重要的考虑因素,以下是一些具体的解决方案和步骤,可以帮助你实现这一目标,需要的朋友可以参考下
    2024-11-11
  • vue+element-plus上传图片及回显问题及数量限制

    vue+element-plus上传图片及回显问题及数量限制

    本文主要介绍了vue+element-plus上传图片及回显问题及数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论