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 来进行赋值
<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("我是message")const changeMsg = () => {message.value = "change msg"}</script><style></style>//--------------------------------ts两种方式<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></style>
isRef
判断是不是一个ref对象
import { ref, Ref,isRef } from 'vue'let message: Ref<string | number> = ref("我是message")let notRef:number = 123const changeMsg = () => {message.value = "change msg"console.log(isRef(message)); //trueconsole.log(isRef(notRef)); //false}
shallowRef
创建一个跟踪自身 .value 变化的 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 = '大满'}</script><style></style>
例子2
这样是可以被监听到的修改value
import { Ref, shallowRef } from 'vue'type Obj = {name: string}let message: Ref<Obj> = shallowRef({name: "小满"})const changeMsg = () => {message.value = { name: "大满" }}
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: "小满"})const changeMsg = () => {message.value.name = '大满'triggerRef(message)}</script><style></style>
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 = newValtrigger()}}})}let message = Myref('小满')const changeMsg = () => {message.value = '大满'// triggerRef(message)}</script>
