shallowReactive和shallowRef

  • 在學習reactive和ref的時候我們說過,reactive和ref為遞歸監(jiān)聽本質(zhì)是Proxy只能監(jiān)聽到當前對象下屬性的變化,當屬性為引用數(shù)據(jù)類型時,屬性的屬性他是監(jiān)聽不到的,所以需要遞歸監(jiān)聽,那這樣又有一個問題,在我們的程序中當數(shù)據(jù)過于復雜并且我們沒有這種遞歸監(jiān)聽的需求時,這樣的操作是很消耗性能的,所以VUE還給我們提供的非遞歸監(jiān)聽的API:shallowReactive和shallowRef,只監(jiān)聽第一層數(shù)據(jù)的變化

shallowReactive栗子

<template>
  <div class="page-wrapper">
    <p>-------------------------------shallowReactive--------------------------</p>
    <p>{{state}}</p>
    <button @click="myFn">點我一下</button>
  </div>
</template>
<script lang="js">
import { defineComponent, shallowReactive } from 'vue';
export default defineComponent({
  name: 'shallowReactive-test',
  setup(){
    //shallowReactive生成非遞歸響應(yīng)數(shù)據(jù),只監(jiān)聽第一層數(shù)據(jù)的變化
    //在 shallowReactive 中,并沒有提供 trigger 方案來主動喚醒監(jiān)測變化
    //本質(zhì)上,shallowRef 是特殊的 shallowReactive,而 ref 是特殊的 reactive。
    let state= shallowReactive({
        gf: {
            f: {
                s: {
                    d: 4
                },
                c: 3
            },
            b: 2
        },
        a: 1
    })
    console.log('state', state);
    console.log('state.gf', state.gf)
    console.log('state.gf.f', state.gf.f)
    console.log('state.gf.f.s', state.gf.f.s)
    function myFn(){
        // state.a= 666;
        state.gf.b= 666;
        state.gf.f.c= 666;
        state.gf.f.s.d= 666;
    }

    return {
        state,
        myFn
    }
  }
  
})
</script>

shallowRef栗子

  • VUE還給shallowRef提供了一個主動觸發(fā)UI變化的API:triggerRef,shallowReactive是沒有的大家注意一下?。?!
<template>
  <div class="page-wrapper">
    <p>-------------------------------shallowRef && triggerRef--------------------------</p>
    <p>{{state}}</p>
    <button @click="myFn">點我一下</button>
  </div>
</template>
<script lang="js">
import { defineComponent, shallowRef, triggerRef} from 'vue';
export default defineComponent({
  name: 'shallowRef-test',
  setup(){
    //shallowRef生成非遞歸響應(yīng)數(shù)據(jù),只監(jiān)聽第一層數(shù)據(jù)的變化
    let state= shallowRef({
        gf: {
            f: {
                s: {
                    d: 4
                },
                c: 3
            },
            b: 2
        },
        a: 1
    })
    console.log('state', state);
    console.log('state.value', state.value);
    console.log('state.value.gf', state.value.gf)
    console.log('state.value.gf.f', state.value.gf.f)
    console.log('state.value.gf.f.s', state.value.gf.f.s)
    function myFn(){
        state.value.a= 666;
        state.value.gf.b= 666;
        state.value.gf.f.c= 666;
        state.value.gf.f.s.d= 666;
        
        //對于 shallow 過的 ref 對象,我們還可以手動去觸發(fā) ref 的變化監(jiān)聽事件來實現(xiàn)界面的改變。使用的 api 是 triggerRef
        // triggerRef(state);
        // state.value= {
        //     gf: {
        //         f: {
        //             s: {
        //                 d: 666
        //             },
        //             c: 666
        //         },
        //         b: 666
        //     },
        //     a: 666
        // }
    }

    return {
        state,
        myFn
    }
  }
  
})
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容