2-3-5 Vue3 computed

Posted 沿着路走到底

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-3-5 Vue3 computed相关的知识,希望对你有一定的参考价值。

**`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

以上是关于2-3-5 Vue3 computed的主要内容,如果未能解决你的问题,请参考以下文章

vue3中computed计算属性函数

Vue3的computed用法

手写vue3源码——ref, computed 等

vue3 setup 计算属性 computed

手写vue3源码——ref, computed 等

手写vue3源码——ref, computed 等