亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3中reactive丟失響應(yīng)式問(wèn)題詳解

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

問(wèn)題描述:

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

測(cè)試代碼:

<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('我是標(biāo)題')
    let tableData = reactive([1, 2, 3])
 
    onMounted(() => {
        title.value = '我是段落',
        tableData = [1, 1, 1]
        console.log("title=", title)
        console.log("tableData=", tableData)
    })    
</script>

輸出結(jié)果:

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

如果將一個(gè)對(duì)象賦值給 ref ,那么這個(gè)對(duì)象將通過(guò) reactive() 轉(zhuǎn)為具有深層次響應(yīng)式的對(duì)象。

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

第一步:當(dāng)我們修改 xxx.value 值的時(shí)候,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 方法判斷是否是對(duì)象,是的話就調(diào)用 reactive 方法

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

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

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);
}

結(jié)論:

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

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

如何正確使用 reactive 呢?

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

<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('我是標(biāo)題')
    let obj = reactive({
        tableData: [1, 2, 3]
    })
 
    onMounted(() => {
        title.value = '我是段落',
        obj.tableData = [1, 1, 1]
    })    
</script>

總結(jié)

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

相關(guān)文章

  • vue 中 命名視圖的用法實(shí)例詳解

    vue 中 命名視圖的用法實(shí)例詳解

    這篇文章主要介紹了vue 中 命名視圖的用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-08-08
  • vue3+ts使用APlayer的示例代碼

    vue3+ts使用APlayer的示例代碼

    這篇文章主要介紹了vue3+ts使用APlayer的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • vue+elementUI實(shí)現(xiàn)當(dāng)渲染文本超出一定字?jǐn)?shù)時(shí)顯示省略號(hào)

    vue+elementUI實(shí)現(xiàn)當(dāng)渲染文本超出一定字?jǐn)?shù)時(shí)顯示省略號(hào)

    這篇文章主要介紹了vue+elementUI實(shí)現(xiàn)當(dāng)渲染文本超出一定字?jǐn)?shù)時(shí)顯示省略號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 如何修改Vue打包后文件的接口地址配置的方法

    如何修改Vue打包后文件的接口地址配置的方法

    這篇文章主要介紹了如何修改Vue打包后文件的接口地址配置的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解nuxt sass全局變量(公共scss解決方案)

    詳解nuxt sass全局變量(公共scss解決方案)

    這篇文章主要介紹了詳解nuxt sass全局變量(公共scss解決方案),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 在vue中解決提示警告 for循環(huán)報(bào)錯(cuò)的方法

    在vue中解決提示警告 for循環(huán)報(bào)錯(cuò)的方法

    今天小編就為大家分享一篇在vue中解決提示警告 for循環(huán)報(bào)錯(cuò)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue3使用mitt進(jìn)行組件通信的步驟

    Vue3使用mitt進(jìn)行組件通信的步驟

    這篇文章主要介紹了Vue3使用mitt進(jìn)行組件通信的步驟,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下
    2021-05-05
  • Vue的事件響應(yīng)式進(jìn)度條組件實(shí)例詳解

    Vue的事件響應(yīng)式進(jìn)度條組件實(shí)例詳解

    這篇文章主要介紹了Vue的事件響應(yīng)式進(jìn)度條組件的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • VUE 記賬憑證模塊組件的示例代碼

    VUE 記賬憑證模塊組件的示例代碼

    這篇文章主要介紹了VUE記賬憑證模塊組件的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • element-ui?table使用type='selection'復(fù)選框全禁用(全選禁用)詳解

    element-ui?table使用type='selection'復(fù)選框全禁用(全選禁用)詳解

    element-ui中的table的多選很好用,但是如果其中某一項(xiàng)禁止選擇,該怎樣操作呢,下面這篇文章主要給大家介紹了關(guān)于element-ui?table使用type='selection'復(fù)選框全禁用(全選禁用)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論