4.学习Ref

1.ref

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

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




上面的代码段是不会改变message的值,因为message不是响应式的,无法被vue跟踪,应该改为ref

<template>
  <div>
    <button @click="changeMsg">change</button>
    <div>{{ message }}</div>
  </div>
</template>
 
 
 
<script setup lang="ts">
import { ref, Ref } from "vue";
let message: Ref<string> = ref("I am Zombieq");
const changeMsg = () => {
  message.value = "change msg";
};
</script>
 
 
<style></style>



或者


<template>
  <div>
    <button @click="changeMsg">change</button>
    <div>{{ message }}</div>
  </div>
</template>
 
 
 
<script setup lang="ts">
import { ref } from 'vue'
let message = ref<string | number>("我是message")
 
const changeMsg = () => {
  message.value = "change msg"
}
</script>
 
 
<style>

这是Ref的接口

interface Ref {
value: T
}

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

2.isRef

判断是不是一个ref对象

import { ref, Ref,isRef } from 'vue'
let message: Ref<string | number> = ref("我是message")
let notRef:number = 123
const changeMsg = () => {
  message.value = "change msg"
  console.log(isRef(message)); //true
  console.log(isRef(notRef)); //false
  
}

3.shallowRef

创建一个跟踪自身 .value 变化的 ref,但不会使其值也变成响应式的
例子1
修改其属性是非响应式的这样是不会改变的

<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: "小z"
})
 
const changeMsg = () => {
  message.value.name = '大z'
}
</script>
 
 
<style>
</style>

例2.

import { Ref, shallowRef } from 'vue'
type Obj = {
  name: string
}
let message: Ref<Obj> = shallowRef({
  name: "小满"
})
 
const changeMsg = () => {
  message.value = { name: "大满" }
}

4.triggerRef

配合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: "小z"
  })
  
  const changeMsg = () => {
    message.value.name = '大z'
    triggerRef(message)
  }
</script> 


<style>
</style>

5.customRef

自定义ref
customRef 是个工厂函数要求我们返回一个对象 并且实现 get 和 set(这个比较复杂)

<script setup lang="ts">
import { Ref, shallowRef, triggerRef, customRef } from 'vue'
 
function Myref<T>(value: T) {
  return customRef((track, trigger) => {
    return {
      get() {
        track()
        return value
      },
      set(newVal: T) {
        console.log('set');
        value = newVal
        trigger()
      }
    }
  })
}
 
let message = Myref('小z')
const changeMsg = () => {
  message.value = '大z'
  // triggerRef(message)
}
</script> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值