六、Vue 计算属性

文章目录


简介

在 Vue.js 的开发过程中,"computed"(计算属性)这一特性扮演着至关重要的角色,尤其在应对复杂逻辑、优化数据展示与交互方面,展现出了独特的优势。

一、计算属性的应用场景与优势

(一)应对复杂逻辑展示

在实际的页面开发中,我们常常会遇到需要对数据进行复杂处理后再展示的情况。例如,像反转字符串这样看似简单却会让模板变得复杂难懂的操作。

我们先来看下面这个不使用计算属性的例子:

html 复制代码
<div id="app">
  {{ message.split('').reverse().join('') }}
</div>

在这个实例中,直接在模板内通过一连串的字符串方法(先分割、再反转、最后拼接)来对 message 进行处理并展示。虽然功能上实现了反转字符串的目的,但这样的写法使得模板代码变得冗长、复杂,对于后续阅读和维护代码的开发者来说,理解起来颇具难度。

而当我们使用计算属性时,情况就大不一样了。以下是使用了计算属性的示例:

html 复制代码
<div id="app">
  <p>原始字符串: {{ message }}</p>
  <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})
</script>

在这个实例中,我们声明了一个计算属性 reversedMessage,它内部的函数充当了这个属性的 getter 方法。通过这样的方式,模板中的代码变得清晰简洁,逻辑一目了然,将复杂的数据处理逻辑从模板中剥离出来,放在了计算属性的函数里,更符合代码的可读性和可维护性原则。

(二)依赖更新机制带来的优势

更为重要的是,计算属性具有依赖缓存机制。以 reversedMessage 为例,它依赖于 vm.message,这意味着只有当 vm.message 的值发生改变时,vm.reversedMessage 才会重新进行求值更新。

这种依赖更新机制与使用 methods 来实现类似功能有着本质的区别。我们来看下面使用 methods 的示例:

javascript 复制代码
methods: {
  reversedMessage2: function () {
    return this.message.split('').reverse().join('')
  }
}

当使用 methods 时,在每次页面重新渲染的过程中,无论 this.message 的值有没有变化,只要涉及到调用 reversedMessage2 这个方法的地方,函数都会重新被调用执行,进行一遍字符串的反转操作。而计算属性则会根据依赖关系智能判断是否需要重新求值,避免了不必要的重复计算,所以在性能方面,计算属性往往更具优势,尤其在处理复杂计算或者频繁渲染的场景下,这种优势会更加明显。

不过,在某些特定情况下,如果我们不希望有缓存机制,而是希望每次调用都执行函数逻辑,那么使用 methods 属性就是更合适的选择了,开发者可以根据实际需求灵活选用这两种方式。

二、计算属性的 setter 用法

通常情况下,计算属性默认只提供了 getter 方法,用于获取经过计算后的值。但在一些需要双向数据交互的场景中,我们也可以为计算属性提供一个 setter 方法。

以下是一个具体的实例:

javascript 复制代码
var vm = new Vue({
  el: '#app',
  data: {
    name: 'Google',
    url: 'http://www.google.com'
  },
  computed: {
    site: {
      // getter
      get: function () {
        return this.name + ' ' + this.url
      },
      // setter
      set: function (newValue) {
        var names = newValue.split(' ')
        this.name = names[0]
        this.url = names[names.length - 1]
      }
    }
  }
})
// 调用 setter, vm.name 和 vm.url 也会被对应更新
vm.site = '菜鸟教程 http://www.runoob.com';
document.write('name: ' + vm.name);
document.write('<br>');
document.write('url: ' + vm.url);

在这个例子中,我们定义了一个名为 site 的计算属性,它的 get 函数将 name 和 url 两个数据属性组合起来返回。而当我们给 site 赋值时,就会触发 set 函数,在 set 函数内部,会对传入的新值进行解析,然后分别更新 name 和 url 的值。通过这样的方式,实现了一种基于计算属性的双向数据操作,进一步拓展了计算属性在数据处理和交互方面的灵活性,方便我们根据不同的业务逻辑需求来管理和更新数据。

相关推荐
编程百晓君1 小时前
Harmony OS开发-ArkTS语言速成五
javascript·harmonyos·arkts
明月看潮生1 小时前
青少年编程与数学 02-005 移动Web编程基础 15课题、移动应用开发
前端·青少年编程·编程与数学·移动web
qq_424317181 小时前
html+css+js网页设计 美食 好厨艺西餐美食企业网站模板6个页面
javascript·css·html
JINGWHALE11 小时前
设计模式 结构型 外观模式(Facade Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·外观模式
别发呆了吧2 小时前
vue路由模式面试题
前端·javascript·vue.js·前端面试题
等一场春雨3 小时前
React 中结合 antd 的 Input 组件实现防抖输入
前端·javascript·react.js
大莲芒4 小时前
[React] 生态有哪些
前端·react.js·前端框架
代码对我眨眼睛4 小时前
vite+vue3动态引入资源文件(问题已解决但离了个大谱)
开发语言·javascript·vue.js
疯狂的沙粒4 小时前
如何在 JavaScript 中实现日期格式化?
开发语言·前端·css·node.js
LBJ辉4 小时前
第 23 章 JSON
开发语言·前端·javascript·json·ecmascript