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>