vue3 0 響應式工具集

2021-10-08 12:47:41 字數 3576 閱讀 6787

使用

import from 'vue'

(1)unref

判斷是否是ref物件,是返回ref物件.value值,不是返回引數本身

語法糖:val = isref(val) ? val.value : val

const xx=unref(x)

(2)readonly

接受乙個物件(reactive響應式或js純物件)或ref並返回原始物件的唯讀**

唯讀**是深層的:任何被訪問的巢狀屬性也是唯讀的。

使用ref的屬性都會被**自動解包

const copy = readonly(obj)

(3)shallowreadonly

為物件第一層屬性建立淺層唯讀響應式**,不會深層**,使用ref的屬性都不會被**自動解包

const x=shallowreactive(})

x.x是唯讀的

x.xx.***不是唯讀的

(4)shallowref

建立乙個ref,將會追蹤它的.value更改操作,但是並不會對變更後的.value做響應式**轉換(即變更不會呼叫reactive將新值進行轉換).

只對值是物件時有用,值為普通值更改後依舊為響應式的

更該物件屬性無法被偵聽器偵聽

const foo = shallowref({}) 會追蹤foo的變更

foo.value = {} 因為此時賦值了乙個新的物件,新物件不會變為響應式的,舊物件為響應式的

上面新賦的這個物件並不會變為響應式物件

isreactive(foo.value) false

(5)shallowreactive

為物件第一層屬性建立淺層響應式**,不會深層**,並且使用ref的屬性都不會被**自動解包

const x=shallowreactive(})

x.x是可**的

x.xx是不可**的

x.xx.***是非響應式

(6)toref

為乙個reactive物件的屬性建立乙個ref,並返回該ref,即可通過返回值和reactive物件操作屬性

可以建立返回乙個不存在的屬性

const x = reactive()

const y=toref(x,xx);

y.value和x.xx都可以操作xx屬性

使用toref(reactive,屬性),返回的內容會保持對其源屬性的響應式連線,即雙方修改都會相互影響

使用ref轉換reactive**物件的屬性則不會

(7)torefs

把乙個響應式物件轉換成普通物件,該普通物件的每個屬性都是乙個ref物件,返回的內容會保持對其源屬性的響應式連線,即雙方修改都會相互影響

const x = reactive()

const y=torefs(x);

y.xx.value和x.xx都可操控屬性

常用於解構賦值,使得元素不丟失響應性

const =torefs(reactive())

(8)toraw

返回由reactive或readonly方法轉換成響應式**的普通物件,是原始物件的引用,即修改會影響**物件

這是乙個「逃生艙」,可用於臨時讀取資料而無需承擔**訪問/跟蹤的開銷,也可用於寫入資料而避免觸發更改。

不建議保留對原始物件的持久引用。請謹慎使用。

const foo = {}

const reactivefoo = reactive(foo)

console.log(toraw(reactivefoo) === foo) true

(9)isref

檢查乙個引數是否為乙個 ref 物件。

(10)isproxy

檢查乙個物件是否是由reactive或者readonly方法建立的**。

(11)isreactive

檢查乙個物件是否是由reactive建立的響應式**

若reactive物件被readonly包裹,則也會返回true

isreactive(readonly(reactive({}))) true

(12)isreadonly

檢查乙個物件是否是由readonly建立的唯讀**。

(13)markraw

顯式標記乙個物件為「永遠不會轉為響應式**」,函式返回這個物件本身,淺層標記,對巢狀屬性無效。

即使在響應式物件中作屬性,也依然不是響應式的

const foo = markraw({})

console.log(isreactive(reactive(foo))) false

const bar = reactive()

console.log(isreactive(bar.foo)) false

若const obj3=markraw(}); obj3是不可**的,單獨的name是可**的

const obj4=reactive() obj4.obj3是可**的

即是淺層轉換,即當markraw物件的屬性有物件時,放到其他物件中,是可**的

(14)triggerref

手動執行triggerref(shallowref)執行與shallowref關聯的任何***,即手動設定,使得物件屬性的變化能夠被偵聽器偵聽

const foo = shallowref()

watcheffect(()=>)

watch(foo,function(),)

const clickhanlder=async function()

**示例:

"./logo.png"

>

!<

/h1>}}

}"inc" ref=

'btn'

>clicked

} times.

<

/button>

for=

'(item,index) in 3'

:key=index :ref=

"el=>"

>

}<

/li>

<

/ul>

<

/div>

<

/template>

import

from

'vue'

const themesymbol =

symbol()

export

default

)const robj=

readonly

(obj)

;const divs =

ref(

)let timer;

const btn =

ref(

null);

console.

log(

unref

(normal));

const

inc=()

=>

onmounted((

)=>

)return}}

<

/script>

img

h1 <

/style>

手寫Vue3 0響應式原理

vue3.0 響應式原理 const toproxy new weakmap 放置的是 原物件 過的物件 防止多次 同乙個物件 const toraw new weakmap 放置的是 過的物件 原物件 防止 已經 過的物件 判斷是否為物件 function isobject val 判斷key是否...

Vue3 0 響應式系統(一)

vue3.0 對響應式系統模組進行重構,不再用object.defineproperty了,而是改用proxy。這樣做大體上有兩個好處,一是不用對陣列進行單獨處理了,去掉了vue.set 和 vue.delete介面,因為proxy可以對整個物件進行攔截操作。二是對原始物件資料變為響應式物件資料時不...

Vue3 0系列(Vue3 0是如何變快的 )

來說一說為什麼performance 效能比vue 2.x快1.2 2倍 這裡先提供兩個 2.1 diff演算法優化 例子 我是段落 也就是說,vue3在渲染的時候,給會改變的元素新增了靜態標記 import from vue export function render ctx,cache,pro...