首页 > 其他分享 >Vue3 之 ref、shallowRef、customRef

Vue3 之 ref、shallowRef、customRef

时间:2022-11-20 00:24:05浏览次数:75  
标签:value name 更新 视图 customRef shallowRef ref

  • ref 把对象转化为响应式的;

  • shallowRef是浅层响应式数据,即:只有对value整体修改,才能更新到视图层。而修改具体属性值时,不会更新视图。(shallowReactive和shallowRef一样的效果);

  • shallowRef() 存在的意义:将最终的结果输出到视图,节省一些不必要的输出;

  • shallowRef() 对属性值的修改是可以的,只是不更新到视图层;

  • shallowRef()对属性值修改之后,我们可以通过triggerRef()函数手动更新到视图;

  • shallowRef()在某些情况下执行属性值修改时,同步更新到视图层。ref 和 shallowRef 不能同时使用,会影响shallowRef造成视图更新,ref底层更新逻辑的时候,会调用triggerRef函数;

  • triggerRef 函数做强制更新;

  • 小妙招:控制台设置,启用自定义格式化程序,试一试呦;

  • ref 获取dom元素

  <div ref="dom">
    <button @click="clickFn">改变</button>
  </div>
  
  const dom = ref<HTMLDivElement>()
  
  const clickFn = () => {
    console.log(dom.value?.innerHTML)
  }
  • shallowRef使用例子
<script lang="ts" setup>
import { ref, shallowRef } from 'vue'

type M = {
  name: string
}

const message1 = ref<M>({
  name: '小龙1'
})
const message2 = shallowRef<M>({
  name: '小龙1'
})

const clickFn = () => {
  // 不会更新视图
  message2.value.name = '修改具体name值,不更新'
  triggerRef(message2) 
}

const clickFn = () => {
  // 更新视图
  message2.value = {
    name: 'value 视图更新'
  }
}
const clickFn = () => {
  // 不会更新视图
  message2.value.name = '修改具体name值,不更新'
  // 调用 triggerRef 函数更新
  triggerRef(message2) 
}
const clickFn = () => {
  // 原本不会更新视图,但是ref底层逻辑更新的时候,调用triggerRef函数,更新视图
  message1.value.name = '带动更新'
  message2.value.name = '修改具体name值,不更新'
}
</script>
  • 自定义customRef
import { customRef } from 'vue'

// 自己实现的一个customRef,加简单的防抖
function myRef<T>(value: T) {
  return customRef((track, trigger) => {
    let timer: any
    return {
      get() {
        //  收集依赖
        track()
        return value
      },
      set(newVal) {
        // 出发依赖
        clearTimeout(timer)
        timer = setTimeout(() => {
          timer = null
          value = newVal
          trigger()
        }, 500)
      }
    }
  })
}

// 使用 自定义的customRef 
const obj = myRef<object>({
  name: '小龙1'
})

标签:value,name,更新,视图,customRef,shallowRef,ref
From: https://www.cnblogs.com/DL-CODER/p/16907612.html

相关文章

  • [数学记录]arc137D Prefix Xors
    FWT/高维前缀和入门题。题意:给定一个数列\(a\),每次迭代把原数组替代为前缀异或和数组,求经过\(1-m\)次操作后\(a_n\)的值。\(n\leq10^6\)。首先,无论是手推找规律还......
  • C++ referemce and dereference
    //对reference&和dereference*的进一步理解//#include"iostream"intmain(){inta=9;//等号左边&为引用,取alias举个例子//int&a=b;b=......
  • refresh的停车场
    refresh的停车场TimeLimit:1000ms  Memorylimit:65536K  有疑问?点这里^_^题目描述 refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但......
  • C# Control.Refresh的解释是什么意思?(找到了一个可以看懂的)
    https://blog.csdn.net/caixiexin/article/details/5799715Control. Refresh强制控件使其工作区无效并立即重绘自己和任何子控件。什么意思呢,我们用实例看会很快明白:p......
  • c#入参使用引用类型为啥要加ref?
    摘一段来自官网的说明:方法的参数列表中使用ref关键字时,它指示参数按引用传递,而非按值传递。ref关键字让形参成为实参的别名,这必须是变量。换而言之,对形参执行的任何......
  • 关于前后端分离 跨域的问题之出现两次请求的问题(preflight预检)
    由于浏览器的同源保护需要,第一次请求(请求类型options)到服务器去验证到不到响应就无法通过验证所以需要对客户做一个正常响应(意思就是输出给浏览器,就是空内容)第二次才是......
  • Sublime Text 4126 User/Preferences.sublime-setting
    2022-11-17~/.config/sublime-text/Package/User/Preferences.sublime-setting{"update_check":false,"ignored_packages":["Vintage",],......
  • 关于PowerShell -Verbose 改变 $ErrorActionPreference 的 Bug
    问题我们定义一个function,当我们尝试删除一个不存在的文件,但是不希望有错误出现我们这么写,一切符合预期但是,我们同时希望能记录删除操作的一些信息,我们加上-verbose通......
  • The ultimate Reference book on Perl Programming (ZZ)
    来源: https://www.amazon.com/gp/customer-reviews/R2RBWZ75IBVYZR 5.0outof5starsTheultimateReferencebookonPerlProgramming(Notforthebeginner)Rev......
  • Vue ref属性
    ref属性1.被用来给元素或子组件注册引用信息(id的替代者)2.应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)3.使用方式:  1.打标识:<h1re......