VUE3学习 第三章 认识 ref全家桶、Reactive全家桶、to系列全家桶、computed计算属性、watch侦听器、watchEffect高级侦听器

一、ref全家桶

1. ref

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

案例:
我们这样操作是无法改变message 的值 应为message 不是响应式的无法被vue 跟踪要改成ref

<template>
  <div>
    <button @click="changeMsg">change</button>
    <div>{
   {
    message }}</div>
  </div>
</template>
 
<script setup lang="ts">
let message: string = "我是message"
 
const changeMsg = () => {
   
   message = "change msg"
}
</script>
 
<style>
</style>

需要改为 ref 、 Ref TS对应的接口


interface Ref<T> {
   
  value: T
}

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

2. isRef

用来 判断是不是一个ref对象

import {
   ref, Ref, isRef} from 'vue'
// 这里 ref 是做双向绑定用的   Ref 是TS的用法
let message: Ref<string | number> = ref("111")
let notRef: number = 222
const changeMsg = () => {
   
  console.log(isRef(message)); //true
  console.log(isRef(notRef)); //false
}

3. ref浏览器显示配置

ref在浏览器的console输出显示过于复杂,可以配置一下浏览器设置
在F12中 点击设置 勾选 启动自定义格式设置工具即可
次数 显示的 log 为 Ref<“111”>

4. shallowRef

创建一个跟踪自身 .value 变化的 ref,但不会使其值也变成响应式的 ( 注意! 一定不要和 ref 一起写, 不然他的值也会变成响应式)

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


<template>
  <div>
    <button @click="changeMsg">change</button>
    <div>{
   {
    message }}</div>
  </div>
</template>
 
 
 
<script setup lang="ts">
import {
    Ref, shallowRef } from 'vue'
type Obj = {
   
  name: string
}
let message: Ref<Obj> = shallowRef({
   
  name: "小满"
})
 
const changeMsg = () => {
   
  message.value.name = '大满' // 这样修改无法改变
}

const changeMsg = () => {
   
  message.value = {
    name: "大满" } // 修改他的 value 才会被监听到 从而发送改变
}
</script>
 
<style>
</style>

5. triggerRef

强制更新页面DOM

这样也是可以改变值的 (可以使shallowRef的值强制刷新,从而刷新dom )

<template>
  <div>
    <button @click="changeMsg">change</button>
    <div>{
   {
    message }}</div>
  </div>
</template>
 
<script setup lang="ts">
import {
    Ref, shallowRef,triggerRef } from 'vue'
type Obj = {
   
  name: string
}
let message: Ref<Obj> = shallowRef({
   
  name: "小满"
})
 
const changeMsg = () => {
   
  message.value.name = '大满'
 triggerRef(message)
}
</script> 
 
 
<style>
</style>

6. customRef 和 ref 直接获取dom元素

自定义ref

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

<template>

 <div ref="dom">   // ref 可以获取dom元素  ,但是 ref = "dom"
    wsh
 </div>
<hr>
<div>
  {
   {
   name}}
</div>
<hr>
<button @click="change">修改</button>
</template>

<script setup lang='ts'>
import {
   ref, reactive, onMounted, shallowRef, 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(() => {
   
          console.log('dianjiset')
          value =
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值