vue3 customRef

打造自己的ref吧!

理解

創建一個自己的ref處理額外邏輯

首先我們先用customRef模擬一下ref

使用一個func回傳customRef這個func

customRef裡面的callback中有兩個參數很重要

return中的get裡面必須要調用track 啟用追蹤

return中的set裡面必須調用trigger 觸發更新

這裡面有使用到閉包的概念可以看到value都是一直使用同一個變量

大概流程的理解就是

set的時候修改vlaue並且觸發trigger

trigger就會重新渲染template但是必須要先和get說這個東西要追蹤

<script >
import { customRef } from "vue"
export default {
  setup() {
    function myRef(value) {
      //追蹤 觸發
      return customRef((track, trigger) => {
        // 語法要求必須返回一個物件
        return {
          // 讀
          get() {
            console.log('讀')
            track() //讓get追蹤value數據的變化
            return value
          },
          // 改
          set(nV) {
            console.log('改')
            value = nV //閉包運用
            trigger() //重新解析template
          }
        }
      })
    }
    let keyWord = myRef('Hi')
    return {
      keyWord
    }
  }
}
</script>

<template>
  <input type="text" v-model="keyWord" />
  <h3>{{ keyWord }}</h3>
</template>

打造一個防抖的ref

<script >
import { customRef } from "vue"
export default {
  setup() {
    // myRef
    function myRef(value, delay) {
      let timer
      //追蹤 觸發
      return customRef((track, trigger) => {
        // 語法要求必須返回一個物件
        return {
          // 讀
          get() {
            console.log('讀')
            track() //讓get追蹤value數據的變化
            return value
          },
          // 改
          set(nV) {
            console.log('改')
            clearTimeout(timer)
            value = nV //閉包運用
            timer = setTimeout(() => {
              trigger() //重新解析template
            }, delay)
          }
        }
      })
    }
    let keyWord = myRef('Hi', 500)
    return {
      keyWord
    }
  }
}
</script>

<template>
  <input type="text" v-model="keyWord" />
  <h3>{{ keyWord }}</h3>
</template>