最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3中reactive丟失響應式問題詳解

 更新時間:2023年03月29日 09:36:17   作者:Baobao小包  
在vue3中,如果你用reactive聲明了一個對象,用另一個對象直接給它賦值,那么它就會失去響應式,下面這篇文章主要給大家介紹了關于Vue3中reactive丟失響應式問題的相關資料,需要的朋友可以參考下

問題描述:

使用 reactive 定義的對象,重新賦值后失去了響應式,改變值視圖不會發(fā)生變化。

測試代碼:

<template>
    <div>
        <p>{{ title }}</p>
        <ul>
            <li v-for="(item, index) in tableData" :key="index">{{ item }}</li>
        </ul>
    </div>
</template>
 
<script setup>
    import { ref, reactive, onMounted } from 'vue'
    
    const title = ref('我是標題')
    let tableData = reactive([1, 2, 3])
 
    onMounted(() => {
        title.value = '我是段落',
        tableData = [1, 1, 1]
        console.log("title=", title)
        console.log("tableData=", tableData)
    })    
</script>

輸出結果:

從上述測試代碼中,ref 定義的對象有響應式,而 reactive 定義的對象失去了響應式,這是什么原因呢?官網(wǎng)中寫到:

如果將一個對象賦值給 ref ,那么這個對象將通過 reactive() 轉為具有深層次響應式的對象。

那么,為什么 ref 調(diào)用 reactive 處理對象重新賦值后,不會丟失響應式,但 reactive 卻丟失了呢?

第一步:當我們修改 xxx.value 值的時候,setter 調(diào)用了 toReactive 方法

class RefImpl {
    constructor(value, __v_isShallow) {
        this.__v_isShallow = __v_isShallow;
        this.dep = undefined;
        this.__v_isRef = true;
        this._rawValue = __v_isShallow ? value : toRaw(value);
        this._value = __v_isShallow ? value : toReactive(value);
    }
    get value() {
        trackRefValue(this);
        return this._value; // get方法返回的是_value的值
    }
    set value(newVal) {
        newVal = this.__v_isShallow ? newVal : toRaw(newVal);
        if (hasChanged(newVal, this._rawValue)) {
            this._rawValue = newVal;
            this._value = this.__v_isShallow ? newVal : toReactive(newVal); // set方法調(diào)用 toReactive 方法
            triggerRefValue(this, newVal);
        }
    }
}

 第二步:toReactive 方法判斷是否是對象,是的話就調(diào)用 reactive 方法

const toReactive = (value) => isObject(value) ? reactive(value) : value;

 第三步:reactive 方法,先判斷數(shù)據(jù)是否是“只讀”的,不是就返回 createReactiveObject() 方法處理后的數(shù)據(jù)(createReactiveObject 方法將對象通過 proxy 處理為響應式對象)

function reactive(target) {
    // if trying to observe a readonly proxy, return the readonly version.
    if (isReadonly(target)) {
        return target;
    }
    return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
}

結論:

ref 定義數(shù)據(jù)(包括對象)時,都會變成 RefImpl(Ref 引用對象) 類的實例,無論是修改還是重新賦值都會調(diào)用 setter,都會經(jīng)過 reactive 方法處理為響應式對象。

但是 reactive 定義數(shù)據(jù)(必須是對象),是直接調(diào)用 reactive 方法處理成響應式對象。如果重新賦值,就會丟失原來響應式對象的引用地址,變成一個新的引用地址,這個新的引用地址指向的對象是沒有經(jīng)過 reactive 方法處理的,所以是一個普通對象,而不是響應式對象。

如何正確使用 reactive 呢?

使用 reactive 定義數(shù)據(jù)時,使用對象包含鍵值對的形式,那么就會避免重新賦值的問題。那么,修改測試代碼為:

<template>
    <div>
        <p>{{ title }}</p>
        <ul>
            <li v-for="(item, index) in obj.tableData" :key="index">{{ item }}</li>
        </ul>
    </div>
</template>
 
<script setup>
    import { ref, reactive, onMounted } from 'vue'
    
    const title = ref('我是標題')
    let obj = reactive({
        tableData: [1, 2, 3]
    })
 
    onMounted(() => {
        title.value = '我是段落',
        obj.tableData = [1, 1, 1]
    })    
</script>

總結

到此這篇關于Vue3中reactive丟失響應式問題的文章就介紹到這了,更多相關Vue3 reactive丟失響應式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • VUEJS 2.0 子組件訪問/調(diào)用父組件的實例

    VUEJS 2.0 子組件訪問/調(diào)用父組件的實例

    下面小編就為大家分享一篇VUEJS 2.0 子組件訪問/調(diào)用父組件的實例。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Vue通過axios發(fā)送ajax請求基礎演示

    Vue通過axios發(fā)送ajax請求基礎演示

    這篇文章主要介紹了Vue通過axios發(fā)送ajax請求基礎演示,包括了axios發(fā)送簡單get請求,axios get傳參,axios發(fā)送post請求等基礎代碼演示需要的朋友可以參考下
    2023-02-02
  • 全面解析vue中的數(shù)據(jù)雙向綁定

    全面解析vue中的數(shù)據(jù)雙向綁定

    這篇文章主要介紹了vue中的數(shù)據(jù)雙向綁定問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • Vue3?KeepAlive實現(xiàn)原理解析

    Vue3?KeepAlive實現(xiàn)原理解析

    KeepAlive?是一個內(nèi)置組件,那封裝一個組件對于大家來說應該不會有太大的困難,它的核心邏輯在于它的?render?函數(shù),它用?map?去記錄要緩存的組件,就是?[key,vnode]?的形式,這篇文章主要介紹了Vue3?KeepAlive實現(xiàn)原理,需要的朋友可以參考下
    2022-09-09
  • vue如何將字符串的一部分處理為html文檔并渲染到頁面

    vue如何將字符串的一部分處理為html文檔并渲染到頁面

    這篇文章主要介紹了vue如何將字符串的一部分處理為html文檔并渲染到頁面,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 深入理解vue2.0路由如何配置問題

    深入理解vue2.0路由如何配置問題

    本篇文章主要介紹了vue2.0路由配置問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Vue.set 全局操作簡單示例

    Vue.set 全局操作簡單示例

    這篇文章主要介紹了Vue.set 全局操作,結合簡單實例形式分析了Vue.set 全局操作相關使用技巧與注意事項,需要的朋友可以參考下
    2019-09-09
  • vuejs事件中心管理組件間的通信詳解

    vuejs事件中心管理組件間的通信詳解

    這篇文章主要為大家詳細介紹了vuejs事件中心管理組件間的通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • vue-resource調(diào)用promise取數(shù)據(jù)方式詳解

    vue-resource調(diào)用promise取數(shù)據(jù)方式詳解

    這篇文章主要介紹了vue-resource調(diào)用promise取數(shù)據(jù)方式詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • elementUI select組件使用及注意事項詳解

    elementUI select組件使用及注意事項詳解

    這篇文章主要介紹了elementUI select組件使用及注意事項詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

郯城县| 湖南省| 汉中市| 大厂| 遂宁市| 东安县| 靖边县| 宁都县| 昭平县| 寿阳县| 满洲里市| 绥芬河市| 中超| 年辖:市辖区| 辽中县| 攀枝花市| 夏邑县| 景洪市| 齐齐哈尔市| 合川市| 龙游县| 余干县| 彝良县| 东乡族自治县| 南雄市| 藁城市| 仙桃市| 金昌市| 怀柔区| 三原县| 安顺市| 安岳县| 东乌珠穆沁旗| 乐都县| 星子县| 阜康市| 新营市| 顺昌县| 易门县| 临清市| 林芝县|