vue计算属性及使用详解

yizhihongxing

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 前端导出后端返回的excel文件方式

    Vue 前端导出后端返回的 Excel 文件是一个常见的需求,以下是一种完整的实现攻略。 确认后端返回的 Excel 文件格式 在实现 Vue 前端导出后端返回的 Excel 文件之前,我们需要先确认后端返回 Excel 文件的格式。通常情况下,我们可以使用两种方式来返回 Excel 文件: 1. 直接返回二进制流 后端直接将 Excel 文件的二进制流作为…

    Vue 2023年5月27日
    00
  • JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例

    下面我将为你讲解JS实现鼠标拖拽盒子移动及右键点击盒子消失效果的完整攻略。 1. 鼠标拖拽盒子移动实现 首先,在HTML代码中准备一个盒子元素,例如: <div id="box"></div> 在CSS中为该盒子设置样式,使其成为一个带边框、背景色的方块: #box { width: 100px; height: …

    Vue 2023年5月28日
    00
  • Vue组件与Vue cli脚手架安装方法超详细讲解

    下面是详细讲解“Vue组件与Vue cli脚手架安装方法超详细讲解”的完整攻略。 Vue组件与Vue cli脚手架安装方法超详细讲解 什么是Vue组件 Vue组件是构成Vue应用的基础,Vue应用中所有的元素都是由Vue组件构成的。组件可以是页面上的一个功能块,也可以是多个功能块的集合。 如何创建Vue组件 创建Vue组件的方式有两种,一种是使用Vue.js…

    Vue 2023年5月28日
    00
  • 用vue的双向绑定简单实现一个todo-list的示例代码

    下面详细讲解如何用Vue的双向绑定简单实现一个todo-list的示例代码。 1. 创建Vue实例 首先,需要引入Vue.js文件,并创建Vue实例。在HTML文件中创建一个包含所有Todo项的数组,并在Vue实例中定义data属性来存储数据。示例代码如下: <!DOCTYPE html> <html lang="en"…

    Vue 2023年5月28日
    00
  • Vue之Mixins(混入)的使用方法

    下面是“Vue之Mixins(混入)的使用方法”的完整攻略。 什么是Mixins(混入) Mixin是一种以重用为主的组件方式。其实就是将多个Vue组件中可重用的配置对象提取出来,然后通过mixins把这些对象合并到Vue组件中的属性和方法中,这样就可以使得这些Vue组件共享相同的功能和配置。 Mixins的使用方法 要使用Mixins,需要在Vue组件中使…

    Vue 2023年5月28日
    00
  • 在vue项目中配置你自己的启动命令和打包命令方式

    下面我为你详细讲解在Vue项目中如何配置自己的启动命令和打包命令。 配置启动命令 在Vue项目中,默认的启动命令为npm run serve。如果我们要配置自己的启动命令,可以按照以下步骤进行: 打开项目根目录下的package.json文件,在scripts节点中添加自己的启动命令,如下所示: "scripts": { "st…

    Vue 2023年5月28日
    00
  • vue如何动态实时的显示时间浅析

    那我来分享一下Vue.js实时显示时间的攻略。 1. 使用Vue.js的生命周期函数 Vue.js生命周期函数是指Vue实例在不同阶段会自动执行的一系列函数。我们可以通过生命周期函数来实现实时显示时间的功能。 具体步骤如下: 1.1 创建一个Vue实例 使用Vue.js创建一个Vue实例,在data属性中新增一个变量time,用于存储当前时间,代码如下: v…

    Vue 2023年5月28日
    00
  • 如何用electron把vue项目打包为桌面应用exe文件

    下面是如何用electron把vue项目打包为桌面应用exe文件的完整攻略。 1. 安装electron 首先,需要在项目中安装electron。使用npm安装即可: npm install electron –save-dev 2. 修改package.json 接下来,在项目的package.json文件中添加以下内容: { "name&qu…

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