学习Vue3——Ref全家桶

参考地址

小满Vue3视频

ref

创造响应式对象

这样修改num的值是可以,但是页面展示不正常,因为这不是响应式的,无法被vue追踪

<template>
  <div>
    {{ num }}
  </div>
  <button @click="change">修改</button>
</template>

<script setup lang="ts">
let num = 1
const change = () => {
  num++
  console.log(`num:${num}`)
}
</script>

可以使用ref来包装这个值,完成响应
注意被ref包装之后需要.value 来进行赋值

<template>
  <div>
    {{ num }}
  </div>
  <button @click="change">修改</button>
</template>
<script setup lang="ts">
import { ref } from 'vue'
let num = ref(1)
const change = () => {
  num.value++
  console.log(`num:${num.value}`)
}
</script>

获取元素dom

<template>
  <div ref="dom" @click="getDom">我是dom</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const dom = ref<HTMLDivElement>()
const getDom = () => {
  console.log(dom.value?.innerText) // 我是dom
}
</script>

shallowRef

ref是深层次的响应,shallowRef是浅层次的比较 ,修改其属性是非响应式的

<template>
  <div>Ref: {{ title }}</div>
  <button @click="changeTitle">Ref按钮</button>
  <hr />
  <div>shallowRef:{{ header }}</div>
  <button @click="changeName">shallowRef按钮</button>
  <hr />
</template>
<script setup lang="ts">
import { ref, shallowRef } from 'vue'
let title = ref({ name: 'hello world' })
let header = shallowRef({ name: 'zs' })

const changeTitle = () => {
  title.value.name = 'I am coming'
}

const changeName = () => {
  header.value.name = 'ls'
  console.log(header) // 值已经改变,但是页面不会响应
}
</script>

修改value是可以被监听到的

const changeName = () => {
// 这样写可以导致shallowRef的视图更新
  header.value = {
    name: 'ls'
  }
  console.log(header) 
}

refshallowRef不能写在一起,不然会影响shallowRef 造成视图的更新
因为ref的更新底层调用了triggerRef

const changeName = () => {
// 这样写会导致shallowRef的视图更新
  title.value.name = 'I am coming'
  header.value.name = 'ls'
  console.log(header) 
}

triggerRef

强制更新页面DOM

import { ref, shallowRef, triggerRef } from 'vue'
const changeName = () => {
  header.value.name = 'ls'
  // 这样写也会导致shallowRef的视图更新
  triggerRef(header)
  console.log(header)
}

customRef

customRef 是个工厂函数要求我们返回一个对象 并且实现 get set 适合去做防抖之类的

<template>
  <div>customRef:{{ obj }}</div>
  <button @click="changeObj">customRef按钮</button>
</template>
<script setup lang="ts">
import { customRef } from 'vue'

function MyRef<T>(value: T) {
  let timer: any
  return customRef((track, trigger) => {
    return {
      get() {
        track()
        return value
      },
      set(newVal) {
        clearTimeout(timer)
        timer = setTimeout(() => {
          value = newVal
          timer = null
          trigger()
        }, 1000)
      }
    }
  })
}
const obj = MyRef<string>('zs')
const changeObj = () => {
  obj.value = 'customRef'
  console.log(obj)
}
</script>

isRef

用于判断是否为ref对象

import { ref, isRef, shallowRef } from 'vue'
let num = ref(1)
let header = shallowRef({ name: 'zs' })
let message = '123'
console.log(isRef(num), isRef(message), isRef(header)) // true false true

查看console输出

正常查看,要点开对象,然后点击value,才能看到值
在这里插入图片描述
通过点击在在这里插入图片描述
首选项里可以设置选中启用自定义格式化程序
在这里插入图片描述
然后就可以直接看到值了,不用点击两次来查看了

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值