vue3 ref-爱代码爱编程
接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property,指向该内部值。
ref
<script setup lang="ts">
import { ref } from "vue"
type M = {
name:string
}
const Man = ref<M>({name:"lisi"})
// 修改值
const change = () => {
Man.value.name = "zhangsan"
}
</script>
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
}
shallowRef
浅层响应式
<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: "zhangsan"
})
const changeMsg = () => {
message.value.name = 'lisi'
}
</script>
// 创建一个跟踪自身 .value 变化的 ref,但不会使其值也变成响应式的
import { Ref, shallowRef } from 'vue'
type Obj = {
name: string
}
let message: Ref<Obj> = shallowRef({
name: "lisi"
})
const changeMsg = () => {
message.value = { name: "大满" }
}
// 这样是可以被监听到的修改value
triggerRef
强制更新页面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: "lisi"
})
const changeMsg = () => {
message.value.name = 'zhangsan'
triggerRef(message)
}
</script>
// 这个时候 name 是变化的,triggerRef 强制页面变化
customRef
自定义ref
customRef 是个工厂函数要求我们返回一个对象 并且实现 get 和 set 适合去做防抖之类的
<template>
<div>
{{ name }}
</div>
<button @click="change">修改 customRef</button>
</template>
<script setup lang='ts'>
import { ref, reactive, onMounted, shallowRef, 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('触发了set')
value = newVal
trigger()
},500)
}
}
})
}
const name = myRef<string>('lisi')
const change = () => {
name.value = 'zhangsan'
}
</script>