vue3学习(认识ref全家桶)

学习链接:学习Vue3 第六章(认识Ref全家桶)_小满zs的博客-CSDN博客

ref

接受一个内部值,并返回一个响应式且可变的ref对象。ref对象仅有一个 .value property ,指向该内部值。

案例

我们这样无法改变message的值,因为message不是响应式的,无法被vue跟踪,需要改成ref

<template>
  <div>{{ message }}</div>
  <button @click="changMsg">改变MSG</button>
</template>

<script setup lang="ts">
let message: string = '我是测试'
const changMsg = () => {
  message = 'change msg'
}
</script>

改为ref

Ref TS对应的接口

interface Ref<T>{
    value: T
}

注意:被ref包装后,需要用.value来进行赋值

<template>
  <div>{{ message }}</div>
  <button @click="changMsg">改变MSG</button>
</template>

<script setup lang="ts">
import { ref } from 'vue'

let message = ref<string>('我是测试')

const changMsg = () => {
  message.value = 'change msg'
}
</script>

isRef

判断是不是一个ref对象

<script setup lang="ts">
import { ref, Ref, isRef } from 'vue'

let message: Ref <string | number> = ref<string>('我是测试')
let notRef: number = 123

const changMsg = () => {
  message.value = 'change msg'
  console.log(isRef(message));
  console.log(isRef(notRef));
}
</script>

shallowRef

创建一个跟踪自身 .value变化的ref, 但不会使其值也变成响应式的

例子

修改其属性是非响应式的,这样是不会改变的

<template>
  <div>{{ message }}</div>
  <button @click="changMsg">改变MSG</button>
</template>

<script setup lang="ts">
import { Ref, shallowRef } from 'vue'

type obj = {
  name: string
}

let message: Ref<obj> = shallowRef({
  name: '测试'
})

const changMsg = () => {
  message.value.name = 'change msg'
}
</script>

例子2

这样是可以被监听到的修改value

<template>
  <div>{{ message }}</div>
  <button @click="changMsg">改变MSG</button>
</template>

<script setup lang="ts">
import { Ref, shallowRef } from 'vue'

type obj = {
  name: string
}

let message: Ref<obj> = shallowRef({
  name: '测试'
})

const changMsg = () => {
  message.value = {
    name: 'change msg'
  }
}
</script>

triggerRef

强制更新页面DOM

这样也可以改变其值

<template>
  <div>{{ message }}</div>
  <button @click="changMsg">改变MSG</button>
</template>

<script setup lang="ts">
import { Ref, shallowRef, triggerRef } from 'vue'

type obj = {
  name: string
}

let message: Ref<obj> = shallowRef({
  name: '测试'
})

const changMsg = () => {
  message.value.name = 'change msg'
  triggerRef(message)
}
</script>

customRef

自定义ref

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

<script setup lang="ts">
import { shallowRef, triggerRef, customRef } from 'vue'

function myRef<T = any>(value: T) {
  let timer: any;
  return customRef((track, trigger) => {
    return {
      get() {
        track()
        return value
      },
      set(newVal) {
        clearTimeout(timer)
        timer = setTimeout(() => {
          console.log('触发click');
          value = newVal
          trigger()
        }, 2000)
      }
    }
  })
}
const name = myRef<string>('小满')

const changName = () => {
  name.value = 'change msg'
}
</script>

<template>
  <div>{{ name }}</div>
  <button @click="changName">改变MSG</button>
</template>

追加问题:

       track: 收集依赖。track()函数的调用,等同于手动 收集依赖;然后使用return value将值返回

        trigger:触发依赖。 trigger()函数的嗲用,等同于用户手动 触发依赖更新。

vue3 中Ref本质也是使用track 与trigger去收集与触发依赖

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值