vue计算属性及使用详解

Vue计算属性及使用详解

在Vue中,有一种非常有用的概念:计算属性。在本篇文章中,我将详细解释Vue计算属性的概念及其使用方法,并给出一些示例说明。

什么是Vue计算属性?

计算属性本质上是一个函数,它可以监听Vue实例中的数据变化,并根据数据的变化返回一个新的计算结果。我们使用计算属性来简化Vue模板中复杂的计算逻辑,提高代码的可读性和可维护性。

计算属性的用法

计算属性有两个关键的概念:getter和setter。getter表示获取计算属性的值,setter则在计算属性的值发生变化时被调用。

在Vue实例中定义计算属性的方法如下:

var vm = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  },
  computed: {
    // 计算属性的getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    },
    // 计算属性的setter
    upperCaseMessage: {
      get: function () {
        return this.message.toUpperCase()
      },
      set: function (newValue) {
        this.message = newValue.toLowerCase()
      }
    }
  }
})

在上述代码中,我们定义了两个计算属性:reversedMessageupperCaseMessagereversedMessage的getter方法返回反转后的message字符串,upperCaseMessage的getter方法返回message的大写字符串,setter方法将接收到的值转换为小写字符串并赋值给message

在Vue模板中,我们可以使用计算属性来显示计算逻辑的结果:

<div id="app">
  <p>{{ message }}</p>
  <p>{{ reversedMessage }}</p>
  <p>{{ upperCaseMessage }}</p>
</div>

在上述代码中,我们使用了三个插值表达式来分别显示messagereversedMessageupperCaseMessage的值。插值表达式会自动调用计算属性的getter方法获取最新的计算结果。

计算属性的缓存

计算属性的值是基于它们的响应式依赖进行缓存的。只要相关依赖发生改变,Vue就会自动更新计算属性的值。而如果依赖没有发生变化,计算属性就会返回缓存的结果,从而提高计算效率。

下面是一个计算属性缓存的例子:

var vm = new Vue({
  el: '#app',
  data: {
    firstName: 'John',
    lastName: 'Doe'
  },
  computed: {
    fullName: function () {
      console.log('计算 fullName')
      return this.firstName + ' ' + this.lastName
    }
  }
})

注意,我们在fullName的getter方法中添加了一个console.log语句,用于显示计算fullName的过程是否被执行。

在模板中,我们使用插值表达式来显示fullName

<div id="app">
  <p>{{ fullName }}</p>
</div>

当我们访问页面时,控制台将只显示一次“计算fullName”字符串,而随后的更改firstNamelastName的操作将不会再次触发计算fullName的过程。这是因为Vue自动缓存了这个计算属性的值,并且只有依赖项firstNamelastName发生变化时才会重新计算。

计算属性的依赖

计算属性的值是基于它们的响应式依赖进行缓存的。换句话说,只有当与计算属性相关联的响应式数据发生变化时,计算属性才会被重新计算。

可以使用watch属性来查看计算属性如何追踪其依赖:

var vm = new Vue({
  el: '#app',
  data: {
    firstName: 'John',
    lastName: 'Doe'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  },
  watch: {
    firstName: function (newValue, oldValue) {
      console.log(`firstName 从 ${oldValue} 变为 ${newValue}`)
    },
    lastName: function (newValue, oldValue) {
      console.log(`lastName 从 ${oldValue} 变为 ${newValue}`)
    },
    fullName: function (newValue, oldValue) {
      console.log(`fullName 从 ${oldValue} 变为 ${newValue}`)
    }
  }
})

在上述代码中,我们使用了watch属性来监视firstNamelastNamefullName的值变化情况。

在模板中,我们使用插值表达式来分别显示firstNamelastNamefullName的值:

<div id="app">
  <p>{{ firstName }}</p>
  <p>{{ lastName }}</p>
  <p>{{ fullName }}</p>
</div>

当我们更改firstName时,控制台将会输出一条信息,相应地,更改lastName时,控制台也会输出一条信息。但是当我们更改fullName时,控制台并不会输出任何信息。这是因为fullName是由firstNamelastName这两个依赖项衍生出来的,虽然计算属性的值变了,但是这种变化不会引发其他更改。

计算属性的getter和setter

如前所述,计算属性包括getter和setter:

  • getter返回计算属性的值。
  • setter在计算属性的值被赋值时进行调用。

计算属性的setter可以用来监视计算属性的变化,并相应地做出响应:

var vm = new Vue({
  el: '#app',
  data: {
    firstName: 'John',
    lastName: 'Doe'
  },
  computed: {
    fullName: {
      get: function () {
        return this.firstName + ' ' + this.lastName
      },
      set: function (newValue) {
        var names = newValue.split(' ')
        this.firstName = names[0]
        this.lastName = names[names.length - 1]
      }
    }
  }
})

在上述代码中,我们重新定义fullName计算属性的处理方法,将其变为一个对象,包括getter和setter方法。setter方法将计算属性的值分段赋给名称变量,然后用它们设置firstNamelastName变量。

在模板中,我们使用v-model指令将输入绑定到计算属性:

<div id="app">
  <input type="text" v-model="fullName">
  <p>{{ firstName }}</p>
  <p>{{ lastName }}</p>
</div>

当我们在输入框中输入新的全名时,fullName计算属性的setter将被调用,相应地更新firstNamelastName

示例1:计算属性的应用

计算属性在处理各种形式的数据时非常有用。例如,假设有一个由用户上传的文件列表,每个文件包含文件名和大小。我们可以定义一个计算属性,将所有文件的大小相加,并返回总文件大小。

首先,我们定义一个文件列表和一个计算属性:

var vm = new Vue({
  el: '#app',
  data: {
    files: [
      { name: 'file1.txt', size: 1024 },
      { name: 'file2.txt', size: 2048 },
      { name: 'file3.txt', size: 4096 }
    ]
  },
  computed: {
    totalSize: function () {
      var size = 0
      for (var i = 0; i < this.files.length; i++) {
        size += this.files[i].size
      }
      return size
    }
  }
})

在上述代码中,我们定义了一个名为files的数据数组,其中每个对象具有namesize属性。我们还定义了一个计算属性totalSize,用于将所有文件的大小添加在一起并返回总文件大小。

在模板中,我们使用插值表达式来显示计算属性的值:

<div id="app">
  <table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Size</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="file in files">
        <td>{{ file.name }}</td>
        <td>{{ file.size }}</td>
      </tr>
      <tr>
        <td><strong>Total:</strong></td>
        <td>{{ totalSize }}</td>
      </tr>
    </tbody>
  </table>
</div>

在模板中,我们使用Vue的v-for指令来遍历files数组,并将每个对象的名称和大小输出到表格中。最后一行将计算属性totalSize的值显示到表格中。

示例2:计算属性的过滤器

计算属性可以像方法那样使用,在插值表达式中使用来展示计算结果。与此同时,匿名函数的形式也可以用于计算属性。

var vm = new Vue({
  el: '#app',
  data: {
    files: [
      { name: 'file1.txt', size: 1024 },
      { name: 'file2.txt', size: 2048 },
      { name: 'file3.txt', size: 4096 }
    ]
  },
  computed: {
    // 包含空格的文件名删除空格
    cleanFiles: function () {
      return this.files.map(function (file) {
        return { name: file.name.replace(/\s+/g, ''), size: file.size }
      })
    }
  }
})

在上述代码中,我们重新定义了cleanFiles计算属性的处理方法,将其变为一个匿名函数,该函数将删除文件名中的所有空格。

在模板中,我们可以使用v-for指令和插值表达式来遍历cleanFiles数组,并将每个文件名的空格删除:

<div id="app">
  <ul>
    <li v-for="file in cleanFiles">{{ file.name }}</li>
  </ul>
</div>

在上述代码中,我们使用Vue的v-for指令遍历cleanFiles数组,并将每个文件的名称输出为一个列表项,我们使用插值表达式来显示计算属性的结果,即删除空格后的文件名。

总结

计算属性是Vue的一个重要概念,在Vue模板中,通过使用计算属性,我们可以编写简洁、易读的代码,可以简化模板中的计算逻辑。在本文中,我们详细了解了计算属性的定义、使用方式、缓存、依赖、getter和setter等重要特性,同时也通过示例说明了计算属性的各种应用场景。希望本文能对您学习Vue编程有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue计算属性及使用详解 - Python技术站

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

相关文章

  • vue使用websocket的方法实例分析

    Vue使用WebSocket的方法实例分析 WebSocket是一种在单个TCP连接上进行全双工通信的协议。Vue.js是一个流行的JavaScript框架,常用于前端开发。在Vue中使用WebSocket可以实现实时更新数据等功能。本文将详细讲解在Vue中使用WebSocket的方法实例分析。 前置要求 在使用WebSocket之前,需要确保以下内容: 安…

    Vue 2023年5月28日
    00
  • vue mounted组件的使用

    下面是关于“vue mounted组件的使用”的完整攻略。 什么是mounted? 在Vue组件的生命周期中,mounted是一个非常重要的生命周期钩子函数。当组件被挂载到DOM中后,mounted函数会被调用,表示组件已经完全被加载到页面上,并且模板中的所有DOM元素已经生成。 使用方法 使用mounted非常简单,只需要在Vue组件的选项中添加一个mou…

    Vue 2023年5月27日
    00
  • Vue生命周期详解

    Vue生命周期详解 Vue.js 是一个 MVVM 框架,在组件渲染过程中,每个组件都有自己的生命周期。这里将详细介绍 Vue 组件的生命周期函数。 Vue 组件生命周期可以分为四个阶段: 创建阶段 create 挂载阶段 mount 更新阶段 update 销毁阶段 destroy 创建阶段 create 在创建阶段,Vue 组件将从组件配置对象的初始化属…

    Vue 2023年5月28日
    00
  • 15分钟学会vue项目改造成SSR(小白教程)

    下面是关于“15分钟学会vue项目改造成SSR(小白教程)”的完整攻略。 什么是SSR? SSR(Server Side Rendering)即服务端渲染,根据服务端返回的数据,在服务端生成HTML字符串,然后将其发送给客户端进行展示。与传统的SPA(Single Page Application)相比,SSR能够优化页面的SEO和首屏加载速度。 如何将Vu…

    Vue 2023年5月27日
    00
  • vue使用laydate时间插件的方法

    下面是关于“vue使用laydate时间插件的方法”的完整攻略: 一、安装laydate 在项目目录下使用npm命令安装laydate: npm install laydate –save 二、在vue中使用laydate 1. 全局引用 在main.js这个入口文件中引用laydate并使用Vue.use()将其挂载到Vue上: import Vue f…

    Vue 2023年5月28日
    00
  • vue中jsonp插件的使用方法示例

    下面是“vue中jsonp插件的使用方法示例”的完整攻略。 1. 什么是JSONP JSONP,全称为“JSON with Padding”,是一种用于解决跨域请求的技术。在同源策略的限制下,通过script标签的src属性发送请求,服务器返回一段被包裹在回调函数中的JSON数据,然后前端将其解析并使用。 2. JSONP插件在Vue中的使用方法 在Vue中…

    Vue 2023年5月28日
    00
  • vue强制刷新组件的方法示例

    下面是对于 “vue强制刷新组件的方法示例” 的详细讲解攻略: Vue 强制刷新组件方法 在 Vue 中,当我们需要对组件进行强制刷新时,可以使用以下两种方式: 使用 key 属性 Vue 中,每个组件都可以设置一个 key 属性,当组件的 key 值改变时,组件会被强制重新渲染。 例如, <template> <div> <b…

    Vue 2023年5月29日
    00
  • 详解vue3中setUp和reactive函数的用法

    来详细讲解一下vue3中setUp和reactive函数的用法。 1. setUp函数 setUp函数是在vue组件初次渲染之前调用的函数,它可以执行各种初始化操作,并且可以直接返回一个代表组件实例的对象,这样我们就可以在组件内部使用普通变量而不是响应式变量了,从而避免了响应式变量在模板中被不小心改变的情况。 在组件内部使用普通变量示例如下: import …

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