学习Vue3 第三章(响应式基础-Ref全家桶)

52 阅读1分钟

ref

接收一个内部值并返回一个 响应式且可变的ref对象,此对象只有一个指向其内部值的属性 .value

<template>
  <div>{{ count }}</div>
  <button @click="add">操作</button>
</template>

<script setup>
import { ref } from 'vue'
let count = ref(1)
const add = () => {
  count.value++
}
console.log(count)
</script>

isRef

检查某个值是否为 ref

<script setup>
import { ref, isRef } from 'vue'
let count = ref(1)
let a = 3
console.log(isRef(count))
console.log(isRef(a))
</script>

shallowRef

创建一个跟踪自身.value变化的ref,但不会使其值也变成响应式, ref和shallowRef是不能一起写的,不然会影响shallowRef, 造成视图的更新,为啥会更新呢,就是下面的tiggerRef

<script setup>
import { shallowRef, ref, triggerRef } from 'vue'
let count = ref(1)
let msg = shallowRef({
  age: 18,
})
const add = () => {
  count.value++ // 触发响应式 导致showRef的深度响应式
  msg.value.age++ //  正常是不会触发视图更新的,
  console.log(msg)
}
</script>

tiggerRef

强制更新页面Dom

<script setup>
import { shallowRef, ref, triggerRef } from 'vue'
let count = ref(1)
let msg = shallowRef({
  age: 18,
})
const add = () => {
  msg.value.age++
  triggerRef(msg) // 触发响应式 导致showRef的深度响应式
  console.log(msg)
}
</script>

customRef

自定义ref

<script setup>
import { ref, customRef } from 'vue'
// 自定义ref函数
const myRef = (value, delay = 1000) => {
  return customRef((track, trigger) => {
    let timer = null
    return {
      get() {
        track()
        return value
      },
      set(newValue) {
        clearTimeout(timer)
        timer = setTimeout(() => {
          console.log('触发更新')
          value = newValue
          trigger()
        }, delay)
      },
    }
  })
}

let flag = myRef('yoga')
console.log(flag.value)

const add = () => {
  flag.value = '林宥嘉'
}
</script>