2-3-5 Vue3 computed

本文深入探讨了Vue.js中的`computed`属性,它是一种基于依赖的计算缓存机制。与普通getter和setter相比,`computed`提供了自动缓存和依赖跟踪的功能,只在相关数据变化时重新计算。通过示例,我们展示了如何使用`computed`优化性能,避免不必要的计算。同时,对比了直接使用函数进行计算的方式,强调了`computed`的自动更新和依赖管理的优势。
摘要由CSDN通过智能技术生成

**`computed` 本质是一种基于依赖的计算缓存。**

const count = ref(1)
const plusOne = computed({
  get: () => count.value + 1,
  set: val => {
    count.value = val - 1
  }
})

plusOne.value = 1
console.log(count.value) // 0

思考一个问题:这个和普通的getter和setter有什么区别?为什么需要单独封装一个`computed` ?

export const ComputedExample03 = defineComponent({
  setup() {
    const count = ref(1)
    const plusOne = {
      get value() {
        return count.value + 1
      },
    }
    return () => {
      return <div>{plusOne.value}<button onClick={() => count.value ++}>+</button></div>
    }
  },
})

上面例子中触发`onClick` 可以使得组件刷新

`computed` 提供的是对计算的封装,让封装计算更容易。

export const ComputedExample01 = defineComponent({
  setup: () => {
    const msg = ref("hello")

    const reversedMsg = computed(() => {
      return msg.value.split("").reverse().join("")
    })

    return () => {
      return <div>
        <input onInput={(e) => {
          msg.value = (e.target as HTMLInputElement).value
        }} />
        {reversedMsg.value}
      </div>
    }
  },
})

具体的computed的定义:

function computed<T>(
  getter: () => T,
  debuggerOptions?: DebuggerOptions
): Readonly<Ref<Readonly<T>>>

当然上面的程序可以这样写,而不用computed:

export const ComputedExample02 = defineComponent({
  setup: () => {
    const msg = ref("hello")

    const reversedMsg = (msg : string) => {
      return msg.split("").reverse().join("")
    }

    return () => {
      return <div>
        <input onInput={(e) => {
          msg.value = (e.target as HTMLInputElement).value
        }} />
        {reversedMsg(msg.value)}
      </div>
    }
  },
})

保留个人观点:个人认为第二种方案语义更加清晰,因为第二种语义从语法上可以知道这是一次reversedMsg的计算。



最后, `computed` 和使用一个函数进行计算,有一个最本质的区别:

- computed会根据依赖重算

- 提供了基于依赖的缓存

例如下面程序中的`get` 只会触发一次,因为没有依赖的reactive值。

export const ComputedExample04 = defineComponent({
  setup() {
    let val = 1
    const someVal = computed({
      get: () => {
        console.log('run...')
        return val
      },
      set : () => {
        val++
      } 
    }) 
    return () => {
      return (
        <div>
          {someVal.value}
          <button onClick={() => {
            someVal.value ++
          }}>next</button>
        </div>
      )
    }
  },
})

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值