Vue computed实现原理深入讲解

首先我们来了解一下Vue computed属性的作用。

Vue中的computed属性是用于监听依赖变化并进行缓存的属性,其返回值会被缓存,只有当其依赖的属性发生变化时,才会重新计算并返回新值。这样可以避免反复重复计算已经得出的结果。

那么,Vue computed实现原理究竟是什么呢?

首先,我们需要了解computed属性的初始化时机。在Vue实例挂载后,会进行响应式数据的依赖收集和watcher的创建。

对于每个computed属性定义,在Vue实例挂载时,会将其getter函数作为watcher实例的求值函数,并通过Dep类在数据对象的getters数组中进行依赖收集。

当computed属性所依赖的数据发生变化时,watcher实例就会接收到数据更新的通知,并触发对应的setter函数重新求值。

整个computed属性实现的核心在于computed属性的getter函数和对应watcher的求值函数,以及对getter函数进行缓存的机制。

下面我们来演示一下computed属性的使用:

<body>
  <div id="app">
    <p>当前计数值为: {{ count }}</p>
    <p>计算属性: {{ computedCount }}</p>
    <button @click="increment">点击增加</button>
  </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
  var vm = new Vue({
    el: '#app',
    data() {
      return {
        count: 0
      }
    },
    computed: {
      computedCount() {
        console.log('计算属性函数执行了')
        return this.count * 2
      }
    },
    methods: {
      increment() {
        this.count++
      }
    }
  })
</script>

在上面的代码中,我们定义了data中的count属性,和computed中的computedCount属性。其中,computedCount属性对count属性进行了监听并做出了相应的计算。每当count属性变化时,其会重新计算并返回新值。

现在我们来增加计数,观察控制台输出结果变化:

可以看到,当count属性发生变化时,computedCount属性的计算函数被重新执行了,而计算函数的结果被缓存起来供下一次使用。

另一个更有趣的示例是一个购物车计价器。我们有一个商品列表,每当用户选择或修改一件商品的数量时,我们需要重新计算总价。

下面是这个案例的代码示例:

<body>
  <div id="app">
    <ul>
      <li v-for="item in list">
        {{ item.name }}:
        <input type="number" v-model="item.num" @change='updateTotal'>
        <span class="price">{{ item.price }}元</span>
      </li>
    </ul>
    <p>购物车总价:{{ total }}元</p>
  </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
  var vm = new Vue({
    el: '#app',
    data() {
      return {
        list: [
          { name: '商品A', price: 10, num: 1 },
          { name: '商品B', price: 20, num: 2 },
          { name: '商品C', price: 30, num: 3 }
        ],
        total: 0
      }
    },
    computed: {
      computedTotal() {
        console.log('计算总价函数执行了')
        return this.list.reduce((sum, item) => sum + item.price * item.num, 0)
      }
    },
    methods: {
      updateTotal() {
        this.total = this.computedTotal
      }
    }
  })
</script>

在上面的代码中,我们定义了一个名为list的数组来存储商品列表,以及一个名为total的computed属性来计算商品总价。当用户修改商品的数量时,我们调用了updateTotal方法来更新computed属性的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue computed实现原理深入讲解 - Python技术站

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

相关文章

  • 详解Vue的组件中data选项为什么必须是函数

    Vue.js官方文档中规定了一个重要的规则:在Vue组件中,data选项必须是函数。 为什么data选项必须是函数? 从根本上来说,这是因为JavaScript中对象和数组是引用类型,如果在组件中直接使用一个变量作为data,则它在所有实例之间共享,一旦该变量的值被修改,则所有的实例都会受到影响。 因此,为了确保每个组件实例都有自己的私有数据,并且不受其他组…

    Vue 2023年5月28日
    00
  • vue.js指令v-for使用及索引获取

    我来给你详细讲解一下 “vue.js 指令 v-for 使用及索引获取” 的完整攻略。 一、vue.js 指令 v-for 的基本用法 在 Vue.js 中,可以使用 v-for 指令来遍历数据,它的基本语法如下: <div v-for="(item, index) in list"> {{ index }}. {{ item…

    Vue 2023年5月29日
    00
  • vue中v-for数据状态值变了,但是视图没改变的解决方案

    当 Vue 中使用 v-for 指令循环渲染数据时,有些情况下会出现数据状态值变了,但是视图没有更新的情况。这通常是由于 Vue 的响应式数据机制以及 JavaScript 原始类型和引用类型的特性所致。 以下是两个示例: 示例一 当循环渲染一个父子组件的情况下,子组件中的数据状态值变化导致父组件视图没有更新。 解决方法: 将父组件的数据状态复制一份到子组件…

    Vue 2023年5月29日
    00
  • VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法

    如果您想在VSCode中快速地生成.vue文件的模板代码,可以使用Vue VSCode Snippets插件。这个插件提供了一系列可以用于在Vue项目中快速生成模板代码的人性化代码片段,例如template、script等。不仅如此,这个插件还支持自定义模板,您可以修改定义对于其他模板的方法,以实现更加高效的开发。 下面是详细的操作过程: 安装Vue VSC…

    Vue 2023年5月28日
    00
  • ElementUI时间选择器限制选择范围disabledData的使用

    为了让大家更好地理解“ElementUI时间选择器限制选择范围disabledData的使用”,我们将分为以下几个步骤进行详细讲解: 安装ElementUI 创建一个ElementUI时间选择器组件 使用disabledData属性,限制时间选择器的选择范围 示例一: <template> <el-date-picker v-model=&…

    Vue 2023年5月29日
    00
  • mpvue小程序循环动画开启暂停的实现方法

    这里是使用mpvue实现小程序循环动画开启暂停的完整攻略。 1. 概述 小程序循环动画开启暂停的实现方法,有多种方案。而在使用mpvue框架时,可以直接使用wx.createAnimation创建动画并进行操作。具体实现步骤如下。 2. 实现步骤 2.1 创建动画 首先,我们需要创建动画。可以使用wx.createAnimation方法创建一个动画实例,代码…

    Vue 2023年5月27日
    00
  • 使用vue3搭建后台系统的详细步骤

    使用Vue3搭建后台系统的详细步骤: 1. 安装Vue CLI 使用Vue CLI可以帮助我们快速地搭建Vue项目环境,可以使用以下命令安装: npm install -g @vue/cli 2. 创建项目 可以使用以下命令创建一个基于Vue3的项目: vue create my-project 3. 安装其他依赖 除了Vue CLI生成的默认依赖外,我们还…

    Vue 2023年5月27日
    00
  • 优雅处理前端异常的几种方式推荐

    错误边界 错误边界是React应用中一种异常处理机制,用于处理任何可能在组件树中发生的未捕获 JavaScript 错误。使用错误边界的方式来处理异常会使整个应用程序更具有容错性,使崩溃影响范围更小。 要创建一个错误边界,只需要实现一个名为 static getDerivedStateFromError() 或 componentDidCatch() 生命周…

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