vue3组合式api之toRaw和customRef

84 阅读1分钟
toRaw和markRaw的使用

toRaw是一个函数,他的参数只能是一个响应式的对象,也就是被reactive处理过的数据。 返回的是源数据。也就是说相当于reactive的逆运算,把响应式数据还原成原始的普通对象。 markRaw:标记一个对象, 这个对象以后不管怎么操作,都不会变成响应式的。 以上两个初级中很少使用,主要用来针对一些特殊的数据做性能优化。 customRef 自定义的ref响应式数据,之前我们使用ref,数据的响应式是自动的,我们无法灵活控制,而customRef可以在读取和修改的时候做一些操作,有点类似watch监听。

customRef的使用

customRef是一个函数,有固定的语法。

  1. 他的参数是一个回调函数。
  2. 回调函数的返回值必须是一个对象
  3. 回调函数的返回值对象里面必须有两个属性,一个是get,一个是set,他们都是函数类型的,分别在数据的读写的时候触发。
  4. 回调函数的参数又是两个函数,vue3提供的,一个是track,写在get中表示追踪数据,一个是trigger,通知vue去重新解析模板
使用案例:输入input值,1秒后同步给页面展示
<template>
<div>
  <input type="text" v-model="keyWord">
  <div>{{keyWord}}</div>
  </div>
</template>

<script>
  import { ref ,customRef} from 'vue'
  export default {
    setup () {
      function myRef(value,delay){
        let timer = null
        return customRef((track,trigger)=>{
          return {
            get(){
              track()
              return value
            },
            set(newValue){
              clearTimeout(timer)
              timer = setTimeout(()=>{
                value = newValue
                trigger()
              },delay)
            }
          }
        })
      }
      let keyWord = myRef('',1000)
      return {keyWord}
    }
  }
</script>