国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3 - 使用reactive定義響應(yīng)式數(shù)據(jù)進(jìn)行列表賦值時(shí),視圖沒有更新的解決方案

這篇具有很好參考價(jià)值的文章主要介紹了vue3 - 使用reactive定義響應(yīng)式數(shù)據(jù)進(jìn)行列表賦值時(shí),視圖沒有更新的解決方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1,問題

在Vue 3.0 中我們使用 reactive() 定義的響應(yīng)式數(shù)據(jù)的時(shí)候,當(dāng)是一個(gè)數(shù)組或?qū)ο髸r(shí),我們直接進(jìn)行賦值,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)修改成功,但是頁?并沒有自動(dòng)渲染成最新的數(shù)據(jù);這是為什么呢?

就如同官網(wǎng)所說的reactive存在一些局限性:(官方的描述)

vue3 - 使用reactive定義響應(yīng)式數(shù)據(jù)進(jìn)行列表賦值時(shí),視圖沒有更新的解決方案,vue.js,javascript,前端

2,原因

原因就是reactive函數(shù)會(huì)返回一個(gè)Proxy包裝的對(duì)象,所以當(dāng)我們這樣直接賦值時(shí):(看下面例子)

import { reactive } from "vue";

let userInfo = reactive([{name:'Eula'}]) 
console.log(userInfo) // Proxy(Array) 打印出來是一個(gè)Proxy對(duì)象 當(dāng)然具備響應(yīng)式

// 直接后端數(shù)據(jù)進(jìn)行賦值
userInfo = [{name:'優(yōu)菈'}]
console.log(userInfo)  // [{name:'優(yōu)菈'}] 可以看出 就是打印出了一個(gè)普通的數(shù)組 所以不具備響應(yīng)式

這樣賦值的話,就會(huì)把Proxy對(duì)象給覆蓋掉,從而無法觸發(fā)對(duì)應(yīng)的set和get,最終就會(huì)導(dǎo)致丟失掉響應(yīng)性了;

上面的代碼 reactive([{name:'Eula'}]) 創(chuàng)建了一個(gè)響應(yīng)式數(shù)組,返回一個(gè)Proxy包裝的對(duì)象由userInfo變量進(jìn)行存放,但是后面我又把一個(gè)普通的數(shù)組(也就是后端返回的數(shù)據(jù))賦值給userInfo,注意這時(shí)userInfo這個(gè)變量存放的已經(jīng)是一個(gè)普通的數(shù)組了,當(dāng)然也就不具備響應(yīng)式了;

所以:對(duì)于reactive創(chuàng)建的響應(yīng)式數(shù)據(jù)應(yīng)該避免直接使用=號(hào)進(jìn)行賦值;會(huì)覆蓋響應(yīng)式;


3,解決方案

一、再封裝一層數(shù)據(jù),即定義屬性名,在后期賦值的時(shí)候,對(duì)此屬性進(jìn)行直接賦值

再封裝一層數(shù)據(jù),注意myRenderList 這個(gè)屬性就是新增的屬性用來存放列表數(shù)據(jù),就是比較麻煩了一些。

<script setup>
import { reactive, ref } from "vue";
// 定義響應(yīng)式 
let list1 = reactive({myRenderList:[]});

// 請(qǐng)求的數(shù)據(jù)
let newList1 = [
  { name: "Eula", age: "18", isActive: false },
  { name: "Umbra", age: "17", isActive: false },
]

// 更改數(shù)據(jù)
const setList1 = () => {
  list1.myRenderList = newList1
}
</script>

三、使用數(shù)組的splice來直接更改原數(shù)組

還是用reactive來定義響應(yīng)式數(shù)據(jù),只不過改數(shù)據(jù)的方式變了,使用數(shù)組的原生方法splice()來更改原數(shù)組,不是直接覆蓋所以并不會(huì)影響響應(yīng)式;

splice有三個(gè)參數(shù)時(shí),可以對(duì)數(shù)組進(jìn)行修改, 第一項(xiàng)是起始索引, 第二項(xiàng)是長度, 第三項(xiàng)是新插入的元素,可以有多個(gè);

下面的代碼是把之前數(shù)組的每一項(xiàng)刪除掉,然后插入新的數(shù)據(jù)newList1,使用...擴(kuò)展符進(jìn)行展開每一項(xiàng);

 list1.splice(0,list1.length,...newList1)

當(dāng)然,push()方法也是可以觸發(fā)響應(yīng)式的,只不過只能在后面新增數(shù)據(jù)。還有pop,shift,unshift等方法(用的不多)

<script setup>
import { reactive, ref } from "vue";
// 定義響應(yīng)式 
let list1 = reactive([]);

// 請(qǐng)求的數(shù)據(jù)
let newList1 = [
  { name: "Eula", age: "18", isActive: false },
  { name: "Umbra", age: "17", isActive: false },
]

// 更改數(shù)據(jù)
const setList1 = () => {
  // splice三個(gè)參數(shù)時(shí) 第一項(xiàng)是起始索引  第二項(xiàng)是長度  第三項(xiàng)是新插入的元素,可以有多個(gè)
  list1.splice(0,list1.length,...newList1)
}
</script>

三、使用 ref 來定義數(shù)據(jù)

復(fù)雜數(shù)據(jù)類型也可以使用ref進(jìn)行定義,而且數(shù)據(jù)都是響應(yīng)式的;原理就有點(diǎn)像第一種方式,重新包裝了一層value;每次使用的時(shí)候都要寫.value;

ref實(shí)際就是對(duì)一個(gè)普通值做了一層包裝,包裝成一個(gè)對(duì)象,并通過其get和set實(shí)現(xiàn)依賴收集和更新,其實(shí)現(xiàn)原理類似于computed;文章來源地址http://www.zghlxwxcb.cn/news/detail-638012.html

<script setup>
import { reactive, ref } from "vue";
// 定義響應(yīng)式
let list1 = ref([]);

// 請(qǐng)求的數(shù)據(jù)
let newList1 = [
  { name: "Eula", age: "18", isActive: false },
  { name: "Umbra", age: "17", isActive: false },
]

// 更改數(shù)據(jù)
const setList1 = () => {
  list1.value = newList1;
}
</script>

到了這里,關(guān)于vue3 - 使用reactive定義響應(yīng)式數(shù)據(jù)進(jìn)行列表賦值時(shí),視圖沒有更新的解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 解決在vue3中使用reactive響應(yīng)式,賦值后造成頁面不改變的問題?

    解決在vue3中使用reactive響應(yīng)式,賦值后造成頁面不改變的問題?

    我們需要在vue3中使用服務(wù)器的數(shù)據(jù)渲染到頁面上,我使用的是reactive生成的響應(yīng)式數(shù)據(jù)屬性,但是在掛載后請(qǐng)求的數(shù)據(jù)并沒有渲染顯示到頁面上。 技術(shù): vue3 、 element-ui-plus home.vue 我們通過直接賦值,可以看出數(shù)據(jù)變?yōu)槠胀ǖ臄?shù)據(jù)了,并不是響應(yīng)式的。 代碼如下: 可以看出

    2023年04月26日
    瀏覽(25)
  • 【vue3】wacth監(jiān)聽,監(jiān)聽ref定義的數(shù)據(jù),監(jiān)聽reactive定義的數(shù)據(jù),詳解踩坑點(diǎn)

    【vue3】wacth監(jiān)聽,監(jiān)聽ref定義的數(shù)據(jù),監(jiān)聽reactive定義的數(shù)據(jù),詳解踩坑點(diǎn)

    假期第二篇,對(duì)于基礎(chǔ)的知識(shí)點(diǎn),我感覺自己還是很薄弱的。 趁著假期,再去復(fù)習(xí)一遍 之前已經(jīng)記錄了一篇【vue3基礎(chǔ)知識(shí)點(diǎn)-computed和watch】 今天在學(xué)習(xí)的過程中發(fā)現(xiàn),之前記錄的這一篇果然是很基礎(chǔ)的,很多東西都講的不夠細(xì)致 話不多說,進(jìn)入正題: vue2中的watch寫法,(

    2024年02月07日
    瀏覽(18)
  • vue3-響應(yīng)式基礎(chǔ)之reactive

    vue3-響應(yīng)式基礎(chǔ)之reactive

    reactive() 還有另一種聲明響應(yīng)式狀態(tài)的方式,即使用 reactive() API。與將內(nèi)部值包裝在特殊對(duì)象中的 ref 不同,reactive() 將使對(duì)象本身具有響應(yīng)性: 「點(diǎn)擊按鈕+1」 「示例效果」 響應(yīng)式對(duì)象是 JavaScript 代理,其行為就和普通對(duì)象一樣。不同的是,Vue 能夠攔截對(duì)響應(yīng)式對(duì)象所有屬

    2024年01月16日
    瀏覽(31)
  • Vue3 reactive丟失響應(yīng)式問題

    Vue3 reactive丟失響應(yīng)式問題

    問題描述: 使用 reactive 定義的對(duì)象,重新賦值后失去了響應(yīng)式,改變值視圖不會(huì)發(fā)生變化。 測(cè)試代碼: 輸出結(jié)果: ? 從上述測(cè)試代碼中,ref 定義的對(duì)象有響應(yīng)式,而 reactive 定義的對(duì)象失去了響應(yīng)式,這是什么原因呢?官網(wǎng)中寫到: 如果將一個(gè)對(duì)象賦值給 ref ,那么這個(gè)對(duì)

    2024年02月05日
    瀏覽(21)
  • 【Vue3響應(yīng)式入門#01】Reactivity

    【Vue3響應(yīng)式入門#01】Reactivity

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項(xiàng)目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 以下是柏成根據(jù)Vue3官方課程整理的響應(yīng)式書面文檔 - 第一節(jié),課程鏈接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文檔可作為課程的輔助材料,

    2024年02月08日
    瀏覽(57)
  • 【Vue3響應(yīng)式原理#01】Reactivity

    【Vue3響應(yīng)式原理#01】Reactivity

    專欄分享:vue2源碼專欄,vue3源碼專欄,vue router源碼專欄,玩具項(xiàng)目專欄,硬核??推薦?? 歡迎各位ITer關(guān)注點(diǎn)贊收藏?????? 以下是柏成根據(jù)Vue3官方課程整理的響應(yīng)式書面文檔 - 第一節(jié),課程鏈接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文檔可作為課程的輔助材料,

    2024年02月08日
    瀏覽(17)
  • Vue3中reactive響應(yīng)式失效的問題

    彈窗內(nèi)部有一個(gè)挑選框,要通過請(qǐng)求接口獲取挑選框下面可供選擇的數(shù)據(jù)。 這是一個(gè)很簡(jiǎn)單的情境,我立刻有了自己的思路。如果實(shí)現(xiàn)搜索,數(shù)據(jù)較少可以直接用elementplus自帶的filter。如果數(shù)據(jù)較多,就需要傳val,在后臺(tái)進(jìn)行搜索,然后分頁渲染。我選擇的是前者,所以只需

    2024年02月10日
    瀏覽(32)
  • 前端Vue篇之Vue3響應(yīng)式:Ref和Reactive

    在Vue3中,響應(yīng)式編程是非常重要的概念,其中 Ref 和 Reactive 是兩個(gè)關(guān)鍵的API。 Ref : Ref 用于創(chuàng)建一個(gè)響應(yīng)式的基本數(shù)據(jù)類型,比如數(shù)字、字符串等。它將普通的數(shù)據(jù)變成響應(yīng)式數(shù)據(jù),可以監(jiān)聽數(shù)據(jù)的變化。使用 Ref 時(shí),我們可以通過 .value 來訪問和修改數(shù)據(jù)的值。 Reactive :

    2024年04月25日
    瀏覽(25)
  • vue3 reactive包裹數(shù)組無法頁面無法響應(yīng)式

    原代碼如下: 此時(shí)removeItem方法運(yùn)行,打印出historyAccount的值確實(shí)被改變了,但是頁面還是沒有變化 原因: 如果你直接通過賦值的方式改變 reactive 對(duì)象引用的數(shù)組,是不會(huì)觸發(fā)視圖的更新的,應(yīng)該使用 Vue 提供的響應(yīng)式方法來更新響應(yīng)式數(shù)據(jù)。 ?改進(jìn):可以利用splice方法刪除

    2024年04月09日
    瀏覽(32)
  • 避大坑!Vue3中reactive丟失響應(yīng)式的問題

    在vue3中,我們定義響應(yīng)式數(shù)據(jù)無非是ref和reactive。 但是有的小伙伴會(huì)踩雷!導(dǎo)致定義的響應(yīng)式丟失的問題。 大錯(cuò)特錯(cuò)?。?! 大錯(cuò)特錯(cuò)?。?! 1.ref 定義數(shù)據(jù)(包括對(duì)象)時(shí),都會(huì)變成 RefImpl(Ref 引用對(duì)象) 類的實(shí)例,無論是修改還是重新賦值都會(huì)調(diào)用 setter,都會(huì)經(jīng)過 reactive 方法

    2023年04月16日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包