0
点赞
收藏
分享

微信扫一扫

学习Vue3 第六章(认识Ref全家桶)


视频教程​​小满Vue3(第六章 Ref 全家桶 & 源码解析)_哔哩哔哩_bilibili​​

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 来进行赋值

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

}

 ref 小妙招

我们console 输出 

学习Vue3 第六章(认识Ref全家桶)_vue.js

 是个这玩意 查看起来很不方便 Vue 已经想到 了 帮我们做了格式化

学习Vue3 第六章(认识Ref全家桶)_vue.js_02

 

学习Vue3 第六章(认识Ref全家桶)_javascript_03

学习Vue3 第六章(认识Ref全家桶)_javascript_04

学习Vue3 第六章(认识Ref全家桶)_响应式_05

 此时观看打印的值就很明了

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  适合去做防抖之类的

<template>

<div ref="div">小满Ref</div>
<hr>
<div>
{{ name }}
</div>
<hr>
<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>('小满')


const change = () => {
name.value = '大满'
}

</script>
<style scoped>
</style>

举报

相关推荐

第六章 字典(3)

第六章 容器

第六章:接口

第六章总结

PTA第六章

第六章 BOM

0 条评论