Skip to content

计算属性 computed

  • computed 计算属性应写成对象的形式,包含 get 和 set 两个方法;当读取计算属性时,get 方法就会被调用,且返回值就作为计算属性的值;当修改计算属性时,set 方法就会被调用;
  • 计算属性依赖 return 实现功能;
  • 计算属性简写:当只读不改时,计算属性可简写为一个函数。
javascript
new Vue({
  computed: {
    fullName: {
      // 读取计算属性
      // get 在初次读取 fullName 的值和所依赖的数据发生变化时被调用
      get() { return this.firstName + '-' + this.lastName },
      // 修改计算属性
      set(value) {
        const arr = value.split('-')
        this.firstName = arr[0]
        this.lastName = arr[1]
      }
    }
	},
  // 简写(只读不改)
  computed: {
    fullName() { return this.firstName + '-' + this.lastName }
  }
})
  • 要用的属性不存在,要通过已有的属性计算得来,就使用计算属性;
  • 与 methods 实现相比,计算属性内部有缓存机制 (复用),效率更高,调试方便;
  • 计算属性最终会出现在 vm 上,在模板中直接读取使用即可;
  • 把计算属性当作一个快照,不要修改计算属性的返回值;
  • 被 Vue 管理的函数,最好写成普通函数,这样 this 的指向才是 vm 或 vc;
  • 不被 Vue 所管理的函数 (定时器的回调函数、ajax 的回调函数、Promise 的回调函数等),最好写成箭头函数。

手动实现一个 computed 函数

javascript
const memory = (fn) => {
  // 缓存对象,用于存储函数的计算结果
  const cache = new Map();

  // 返回一个新的函数
  return function (...args) {
    // 将参数转换为字符串,用作缓存的键
    const key = JSON.stringify(args);

    // 如果缓存中存在结果,则直接返回缓存结果
    if (cache.has(key)) {
      return cache.get(key);
    }

    // 否则,调用原函数计算结果
    const result = fn(...args);

    // 将结果存入缓存中
    cache.set(key, result);

    // 返回计算结果
    return result;
  };
};

// 示例用法
const complexCalculation = (num) => {
  console.log('计算中...');
  return num * num;
};

const memoizedCalculation = memory(complexCalculation);

console.log(memoizedCalculation(5)); // 计算中... 25
console.log(memoizedCalculation(5)); // 25(从缓存中读取,不会再次计算)
console.log(memoizedCalculation(6)); // 计算中... 36
console.log(memoizedCalculation(6)); // 36(从缓存中读取,不会再次计算)