Vue3入門到精通 - reactive 以及reactive相關(guān)函數(shù)

傳送門

Vue3入門到精通-setup
Vue3入門到精通 --ref 以及 ref相關(guān)函數(shù)

Vue3入門到精通 - reactive 以及reactive相關(guān)函數(shù)
\color{#FF8C00}{\rm\large{是什么}}
  • 將引用類型數(shù)據(jù) -> 響應(yīng)式數(shù)據(jù) ===> 把值類型的數(shù)據(jù)包裝編程響應(yīng)式的引用類型的數(shù)據(jù)。
  • 函數(shù)
  • reactive 參數(shù)必須是對象(json/arr)

默認情況下修改對象,界面不會自動更新。
如果想更新全跨,可以通過重新賦值的方式。

  • 本質(zhì):將傳入的數(shù)據(jù)包裝成一個Proxy對象。
用法
創(chuàng)建變量
案例一
import {reactive} from 'vue';

let state = reactive([1, 2, 3]);

console.log(state) // Proxy {0: 1, 1: 3, 2: 5}

\color{#FF69B4}{\rm\large{注意以下代碼片段}}!!!!
<p>{{state}}</p>
<button @click="myFn">按鈕</button>

let obj = [1, 2, 3];
let state = reactive(obj)
console.log(obj);   // (3) [1, 2, 3]
console.log(state); // Proxy {0: 1, 1: 2, 2: 3}   
// 頁面顯示是[1, 2, 3]

function myFn() {
    state[3] = "zs";
    console.log(obj);   //(4) [1, 2, 3, "zs"]
    console.log(state); //Proxy {0: 1, 1: 2, 2: 3, 3: "zs"}
    // 點擊按鈕后
    // 頁面顯示是[1, 2, 3, "zs"]
    // 由此-》根據(jù)下標修改數(shù)據(jù)可以觸發(fā)頁面的更新
    // 且 state的修改對原數(shù)據(jù)的修改有影響
}

function myFn() {
    obj[3] = "ls";
    console.log(obj);   //(4) [1, 2, 3, "ls"]
    console.log(state); //Proxy {0: 1, 1: 2, 2: 3, 3: "ls"}
    // 點擊按鈕后
    // 頁面顯示是[1, 2, 3]
    // 且 原數(shù)據(jù)的修改對state的修改有影響
    //  但是頁面不會觸發(fā)更新
}

function myFn() {
    state = [4,5,6];
    console.log(obj);   //(3) [1, 2, 3]
    console.log(state); //(3) [4, 5, 6]
    // 點擊按鈕后
    // 頁面顯示是[1, 2, 3]
    // 直接對state進行修改不會觸發(fā)頁面的更新汁讼,但是上面對下標進行修改可以觸發(fā)頁面更新
    //  同時這里直接進行復(fù)制,導(dǎo)致state不再是proxy
    
    // 這里你可以使用
    //  Object.assign(state,[4,5,6])
    // 這樣也可以 觸發(fā)頁面的更新阔墩,
    // 這個方法在ajax請求之后進行賦值嘿架,很好用
}

案例2
import {reactive} from 'vue';

let state = reactive( { name: "zs", age: 19 });


// 這里不再贅述,效果和上面的Array一致

ref和reactive的卻別區(qū)別

ref是把值類型添加一層包裝啸箫,使其變成響應(yīng)式的引用類型的值耸彪。
reactive 則是引用類型的值變成響應(yīng)式的值。
所以兩者的區(qū)別只是在于是否需要添加一層引用包裝

本質(zhì)上

ref(0) --> reactive( { value:0 })

\color{#FF8C00}{\rm\large{相關(guān)API}}
isReactive
作用
  • 檢查對象是否是 reactive創(chuàng)建的響應(yīng)式 proxy忘苛。

其實內(nèi)部是判斷數(shù)據(jù)對象上是否包含__v_isRef 屬性并且其值為 true蝉娜。

用法
let state = reactive( { name: "zs", age: 19 });
console.log(isReactive(state)) // true
readonly
作用

其聲明一個只讀的proxy

與const的區(qū)別

const: 賦值保護, 不能給變量重新賦值
readonly: 屬性保護, 不能給屬性重新賦值

用法
<p>{{state.name}}</p>
<p>{{state.attr.age}}</p>
<button @click="myFn">按鈕</button>

let state = readonly({name:'syl', attr:{age:18}});
function myFn() {
    state.name = 'zs';
    state.attr.age = 19;
    console.log(state); // proxy{name:'syl', attr:{age:18}}
    console.log(isReadonly(state)); // true
    // 變量無法更改
    // 點擊按鈕后頁面沒有變化
}

isReadonly
作用

檢查對象是否是由readonly創(chuàng)建的只讀代理

shallowReactive
作用

創(chuàng)建一個響應(yīng)式代理,該代理跟蹤其自身 property 的響應(yīng)性扎唾,但不執(zhí)行嵌套對象的深度響應(yīng)式轉(zhuǎn)換 (暴露原始值)召川。

shallowReadonly
作用

用于創(chuàng)建一個只讀的數(shù)據(jù), 但是不是遞歸只讀的

<p>{{state.name}}</p>
<p>{{state.attr.age}}</p>
<button @click="myFn">按鈕</button>

let state = shallowReadonly({name:'syl', attr:{age:18}});
function myFn() {
    state.attr.age = 19;
    console.log(state.attr.age) // 19
    // 點擊按鈕頁面沒有變化
}


function myFn() {
    state.name = 'ls';
    console.log(state.name) // syl
    // 數(shù)據(jù)無法更改
    // 點擊按鈕頁面沒有變化
}
toRaw
作用

從reactive 得到原始數(shù)據(jù)

用法
let obj = {name:'syl', age:18};
/*
ref/reactive數(shù)據(jù)每次修改都會被追蹤, 都會更新界面
但是當你不需要更新UI界面, 
可以通過toRaw方法拿到它的原始數(shù)據(jù), 對原始數(shù)據(jù)進行修改
這樣就不會被追蹤不會更新界面,
*/
let state = reactive(obj);
let obj2 = toRaw(state);
console.log(obj === obj2); // true

function myFn() {
    obj2.name = 'zs';
    console.log(obj2); // {name: "zs", age: 18}
    console.log(state); // {name: "zs", age: 18}
}
 // 這個例子在上面出現(xiàn)過
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胸遇,隨后出現(xiàn)的幾起案子荧呐,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倍阐,死亡現(xiàn)場離奇詭異概疆,居然都是意外死亡,警方通過查閱死者的電腦和手機峰搪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門岔冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人概耻,你說我怎么就攤上這事使套。” “怎么了咐蚯?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵童漩,是天一觀的道長。 經(jīng)常有香客問我春锋,道長矫膨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任期奔,我火速辦了婚禮侧馅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呐萌。我一直安慰自己馁痴,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布肺孤。 她就那樣靜靜地躺著罗晕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赠堵。 梳的紋絲不亂的頭發(fā)上小渊,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音茫叭,去河邊找鬼酬屉。 笑死,一個胖子當著我的面吹牛揍愁,可吹牛的內(nèi)容都是我干的呐萨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼莽囤,長吁一口氣:“原來是場噩夢啊……” “哼谬擦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朽缎,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤怯屉,失蹤者是張志新(化名)和其女友劉穎蔚舀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锨络,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年狼牺,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡儿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡是钥,死狀恐怖掠归,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悄泥,我是刑警寧澤虏冻,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站弹囚,受9級特大地震影響厨相,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸥鹉,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一蛮穿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毁渗,春花似錦践磅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肺樟,卻和暖如春檐春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背儡嘶。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工喇聊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹦狂。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓誓篱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凯楔。 傳聞我的和親對象是個殘疾皇子窜骄,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容