1 ref
接受一個內部值并回傳一個回應式且可變的 ref 物件,ref 物件僅有一個 .value property,指向該內部值,
案例
<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>
我們這樣操作是無法改變message 的值 應為message 不是回應式的無法被vue 跟蹤要改成ref,回應式就是在頁面上實時顯示修改的值,
Ref TS對應的介面:
interface Ref<T> {
value: T
} // 對于介面問題,是TS語法,如果不清楚,直接看TS
但是被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")
let message= ref<string>("我是message") // 第二種方式
const changeMsg = () => {
message.value = "https://www.cnblogs.com/lotusflower/archive/2022/08/04/change msg"
}
</script>
<style>
</style>
2 isref
判斷是不是一個ref物件import { ref, Ref,isRef } from 'vue'
let message: Ref<string | number> = ref("我是message")
let notRef:number = 123
const changeMsg = () => {
message.value = "https://www.cnblogs.com/lotusflower/archive/2022/08/04/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: "唐少"
})
const changeMsg = () => {
message.value.name = '唐少2'
}
</script>
<style>
</style>
例子2
這樣是可以被監聽到的修改value,必須要修改整個物件才行
import { Ref, shallowRef } from 'vue'
type Obj = {
name: string
}
let message: Ref<Obj> = shallowRef({
name: "唐少"
})
const changeMsg = () => {
message.value = https://www.cnblogs.com/lotusflower/archive/2022/08/04/{ name:"唐少2" }
}
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: "唐少"
})
const changeMsg = () => {
message.value.name = '唐2'
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 = https://www.cnblogs.com/lotusflower/archive/2022/08/04/newVal
trigger()
}
}
})
}
let message = Myref('唐少')
const changeMsg = () => {
message.value = 'https://www.cnblogs.com/lotusflower/archive/2022/08/04/唐少2'
// triggerRef(message)
}
</script>
6 reactive
用來系結復雜的資料型別 例如 物件 陣列
reactive 原始碼約束了我們的型別,型別必須是object,不能系結普通的型別,會報錯,你如果用ref去系結物件 或者陣列等復雜的資料型別 我們看原始碼里面其實也是 去呼叫reactive,但使用reactive 去修改值無須.value
- reactive 基礎用法
import { reactive } from 'vue'
let person = reactive({
name:"唐少"
})
person.name = "唐少2"
- 陣列異步賦值問題
// 這樣賦值頁面是不會變化的因為會脫離回應式
let person = reactive<number[]>([]) setTimeout(() => { person = [1, 2, 3] console.log(person); },1000)
- 解決方案1:push
import { reactive } from 'vue'
let person = reactive<number[]>([])
setTimeout(() => {
const arr = [1, 2, 3]
person.push(...arr)
console.log(person);
},1000)
- 解決方案2:包裹一層物件
type Person = {
list?:Array<number>
}
let person = reactive<Person>({
list:[]
})
setTimeout(() => {
const arr = [1, 2, 3]
person.list = arr;
console.log(person);
},1000)
7 readonly
拷貝一份proxy物件將其設定為只讀
import { reactive ,readonly} from 'vue'
const person = reactive({count:1})
const copy = readonly(person)
//person.count++
copy.count++
8 shallowReactive
只能對淺層的資料 如果是深層的資料只會改變值 不會改變視圖
<template>
<div>
<div>{{ state }}</div>
<button @click="change1">test1</button>
<button @click="change2">test2</button>
</div>
</template>
<script setup lang="ts">
import { shallowReactive } from 'vue'
const obj = {
a: 1,
first: {
b: 2,
second: {
c: 3
}
}
}
const state = shallowReactive(obj)
function change1() {
state.a = 7
}
function change2() {
state.first.b = 8
state.first.second.c = 9
console.log(state);
}
</script>
<style>
</style>
9 toRef
如果原始物件是非回應式的就不會更新視圖 資料是會變的,如果原始物件是回應式的是會更新視圖并且改變資料的
<template>
<div>
<button @click="change">按鈕</button>
{{state}}
</div>
</template>
<script setup lang="ts">
import { reactive, toRef } from 'vue'
const obj = {
foo: 1,
bar: 1
}
const state = toRef(obj, 'bar')
// bar 轉化為回應式物件
const change = () => {
state.value++
console.log(obj, state);
}
</script>
10 toRefs
可以幫我們批量創建ref物件主要是方便我們解構使用
import { reactive, toRefs } from 'vue'
const obj = reactive({
foo: 1,
bar: 1
})
let { foo, bar } = toRefs(obj)
foo.value++
console.log(foo, bar);
11 toRaw
將回應式物件轉化為普通物件
import { reactive, toRaw } from 'vue'
const obj = reactive({
foo: 1,
bar: 1
})
const state = toRaw(obj)
// 回應式物件轉化為普通物件
const change = () => {
console.log(obj, state);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/501011.html
標籤:其他
上一篇:JS兼容問題總結
下一篇:day 8 Bom瀏覽器物件模型
