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

2023.3.22 Vue 數(shù)據(jù)更新了但頁面沒有更新的情況

這篇具有很好參考價(jià)值的文章主要介紹了2023.3.22 Vue 數(shù)據(jù)更新了但頁面沒有更新的情況。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

背景

在vue項(xiàng)目中,有些我們會(huì)遇到修改完數(shù)據(jù),但是視圖卻沒有更新的情況。具體的場景不一樣,解決問題的方法也不一樣。在網(wǎng)上看了很多文章,在此總結(jié)匯總一下。針對(duì),數(shù)據(jù)更新視圖沒有更新的情況,建議深入了解一下,vue的響應(yīng)式原理。

如果,你發(fā)現(xiàn)自己需要在vue中做一次強(qiáng)制更新,99.9%的情況,是你在某個(gè)地方做錯(cuò)了事。

一、vue數(shù)據(jù)更新但頁面沒有更新的7種情況匯總

1.vue無法檢測實(shí)例被創(chuàng)建時(shí),不存在于data中的property

原因:由于vue會(huì)在初始化實(shí)例時(shí),對(duì)property執(zhí)行g(shù)etter/setter轉(zhuǎn)化,所以,property必須在data對(duì)象上存在才能讓vue將它轉(zhuǎn)化為響應(yīng)式的。

①場景:

var vm = new Vue({
  data:{},
  // 頁面不會(huì)變化
  template: '<div>{{message}}</div>'
})
vm.message = 'Hello!' // `vm.message` 不是響應(yīng)式的

②解決辦法:

var vm = new Vue({
  data: {
    // 聲明 a、b 為一個(gè)空值字符串
    message: '',
  },
  template: '<div>{{ message }}</div>'
})
vm.message = 'Hello!'

2.vue無法檢測對(duì)象property的添加或移除

原因:官方–由于JavaScript( ES5)的限制,Vue.js不能檢測到對(duì)象屬性的添加或刪除。因?yàn)関ue.js在初始化實(shí)例時(shí)將屬性轉(zhuǎn)為getter/setter,所以屬性必須在data對(duì)象上才能讓vue.js轉(zhuǎn)換它,才能讓它使響應(yīng)的。

①場景:

 var vm = new Vue({
  data:{
    obj: {
      id: 001
    }
  },
  // 頁面不會(huì)變化
  template: '<div>{{ obj.message }}</div>'
})
 
vm.obj.message = 'hello' // 不是響應(yīng)式的
delete vm.obj.id       // 不是響應(yīng)式的

②解決辦法:

//動(dòng)態(tài)添加 -- vue.set
Vue.set(vm.obj,propertyName,newValue);
 
//動(dòng)態(tài)添加 -- vm.$set
vm.$set(vm.obj,propertyName,newValue);
 
//動(dòng)態(tài)添加多個(gè)
// 代替Object.assign(this.obj,{a:1,b:2})
this.obj = Object.assign({},this.obj,{a:1,b:2});
 
//動(dòng)態(tài)移除--vm.$delect
Vue.delete(vm.obj,propertyName);
 
//動(dòng)態(tài)移除 --vm.$delete
vm.$delete(vm.obj,propertyName);

3.vue不能檢測通過數(shù)組索引值,直接修改一個(gè)數(shù)組項(xiàng)

原因:官方–由于JavaScript的限制,Vue不能檢測數(shù)組和對(duì)象的變化;性能代價(jià)和獲得用戶體驗(yàn)不成正比。

①場景:

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 不是響應(yīng)性的

②解決辦法:


//Vue.set
Vue.set(vm.items,indexOfItem,newValue);
 
//vm.$set
vm.$set(vm.items,indexOfItem,newValue);
 
//Array.prototype.splice
vm.items.splice(indexOfItem,1,newValue);

擴(kuò)展:Object.defineProperty()可以監(jiān)測數(shù)組的變化

Object.defineProperty()可以監(jiān)測到數(shù)組的變化。但對(duì)數(shù)組新增一個(gè)屬性(index)不會(huì)監(jiān)測到數(shù)據(jù)變化,因?yàn)闊o法監(jiān)測到新增數(shù)組的小標(biāo)(index),刪除一個(gè)屬性(index)也是。

①場景:

var arr = [1, 2, 3, 4]
arr.forEach(function(item, index) {
    Object.defineProperty(arr, index, {
    set: function(value) {
      console.log('觸發(fā) setter')
      item = value
    },
    get: function() {
      console.log('觸發(fā) getter')
      return item
    }
  })
})
arr[1] = '123'  // 觸發(fā) setter
arr[1]          // 觸發(fā) getter 返回值為 "123"
arr[5] = 5      // 不會(huì)觸發(fā) setter 和 getter

4.vue不能監(jiān)測直接修改數(shù)組長度的變化

原因:官方–由于JavaScript的限制,vue不能檢測數(shù)組和對(duì)象的變化;(性能代價(jià)和獲得用戶體驗(yàn)不成正比)。

①場景:

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items.length = 2 // 不是響應(yīng)性的

②解決辦法:

vm.items.splice(newLength)

5.在異步更新執(zhí)行之前操作DOM數(shù)據(jù)不會(huì)變化

原因:Vue在更新DOM時(shí)是異步執(zhí)行的。只要偵聽到數(shù)據(jù)變化,vue將開啟一個(gè)隊(duì)列,并緩沖在同一個(gè)事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更。如果同一個(gè)watcher被多次觸發(fā),只會(huì)被推入到隊(duì)列中一次。這種在緩沖時(shí),去除重復(fù)數(shù)據(jù)對(duì)于避免不必要的計(jì)算和DOM操作是非常重要的。然后,在下一個(gè)的時(shí)間循環(huán)"tick"中,vue刷新隊(duì)列并執(zhí)行實(shí)際(已去重的)工作。vue在內(nèi)部對(duì)異步隊(duì)列嘗試使用原生的Promise.then、MutationObserver和setImmediate,如果執(zhí)行環(huán)境不支持,則會(huì)采用setTimeout(fn,0)代替。

①場景:

<div id="example">{{message}}</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: '123'
  }
})
vm.message = 'new message' // 更改數(shù)據(jù)
vm.$el.textContent === 'new message' // false
vm.$el.style.color = 'red' // 頁面沒有變化

②解決辦法:

var vm = new Vue({
  el: '#example',
  data: {
    message: '123'
  }
})
vm.message = 'new message' // 更改數(shù)據(jù)
//使用Vue.nextTick(callback) callback將在DOM更新完成后被調(diào)用
Vue.nextTick(function(){
    vm.$el.textContent === 'new message'  //true
    vm.$el.style.color = 'red' //文字顏色變成紅色

擴(kuò)展:異步更新帶來的數(shù)據(jù)響應(yīng)的誤解

<!-- 頁面顯示:我更新啦! -->
<div id="example">{{message.text}}</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: {},
  }
})
vm.$nextTick(function () {
  this.message = {}
  this.message.text = '我更新啦!'

上段代碼中,我們?cè)赿ata對(duì)象中聲明了一個(gè)message空對(duì)象,然后,在下次DOM更新循環(huán)結(jié)束之后,觸發(fā)的異步回調(diào)中,執(zhí)行了如下兩段代碼:

this.message = {};
this.message.text = '我更新啦!'

到這里,模板更新了,頁面最后會(huì)顯示我更新啦!。

模板更新了,應(yīng)該具有響應(yīng)式特性,如果這么想那么你就已經(jīng)走入誤區(qū)。

一開始,我們?cè)赿ata對(duì)象中,只是聲明了一個(gè)message空對(duì)象,并不具有text屬性,所以該text屬性是不具有響應(yīng)式特性的。

但模板切切實(shí)實(shí)已經(jīng)更新了,這又是怎么回事呢?

那是因?yàn)閂ue.js的DOM更新是異步的,即當(dāng)setter操作發(fā)生后,指令并不會(huì)立馬更新,指令的更新操作會(huì)有一個(gè)延遲,當(dāng)指令更新執(zhí)行的時(shí)候,此時(shí)text屬性已經(jīng)賦值,所以指令更新模板時(shí),得到的是新值。

模板中每一個(gè)指令/數(shù)據(jù)綁定都有一個(gè)對(duì)應(yīng)的watcher對(duì)象,在計(jì)算過程中,它把屬性記錄為依賴。之后當(dāng)依賴的setter被調(diào)用時(shí),會(huì)觸發(fā)watcher重新計(jì)算,也就會(huì)導(dǎo)致它的關(guān)聯(lián)指令更新DOM。
2023.3.22 Vue 數(shù)據(jù)更新了但頁面沒有更新的情況

具體流程如下所示:

  • 執(zhí)行this.message = { };時(shí),setter被調(diào)用;

  • Vue.js追蹤到message依賴的setter被調(diào)用后,會(huì)觸發(fā)watcher重新計(jì)算;

  • this.message.text = ‘我更新啦!’;對(duì)text屬性進(jìn)行賦值;

  • 異步回調(diào)邏輯執(zhí)行結(jié)束之后,就會(huì)導(dǎo)致它的關(guān)聯(lián)指令更新DOM,指令更新開始執(zhí)行。

  • 所以,真正的觸發(fā)模板更新的操作是this.message = { };這一句引起的,因?yàn)橛|發(fā)了setter,所以單看上述例子,具有響應(yīng)式特性的數(shù)據(jù)只有message這一層,它的動(dòng)態(tài)添加的屬性是不具備的。

對(duì)應(yīng)上述第二點(diǎn)–vue無法檢測對(duì)象property的添加或移除

6.循環(huán)嵌套層級(jí)太深,視圖不更新?

看到網(wǎng)上有些人說,數(shù)據(jù)更新的層級(jí)太深,導(dǎo)致數(shù)據(jù)不更新或者更新緩慢從而導(dǎo)致視圖不更新?

PS:我遇到的就是這種情況,暫時(shí)也沒發(fā)現(xiàn)哪里有問題(尷尬.jpg),就使用了強(qiáng)制更新的方法。

針對(duì)上述情況,有人給出解決方法是使用強(qiáng)制更新

如果,你發(fā)現(xiàn)發(fā)自己需要在vue中做一次強(qiáng)制更新,99.99%的情況,是你在某個(gè)地方做錯(cuò)了事。
vm.$forceUpdate()

7.擴(kuò)展:路由參數(shù)變化時(shí),頁面不更新(數(shù)據(jù)不更新)

擴(kuò)展一個(gè)因?yàn)槁酚蓞?shù)變化,而導(dǎo)致頁面不更新的問題,頁面不更新本質(zhì)上就是數(shù)據(jù)沒有更新。

原因:路由視圖組件引用了相同組件時(shí),當(dāng)路由參數(shù)變化時(shí),會(huì)導(dǎo)致該組件無法更新,也就是我們常說的頁面無法更新的問題。

①場景:

<div id="app">
  <ul>
    <li><router-link to="/home/foo">To Foo</router-link></li>    
    <li><router-link to="/home/baz">To Baz</router-link></li>    
    <li><router-link to="/home/bar">To Bar</router-link></li>    
  </ul>    
  <router-view></router-view>
</div>
const Home = {
    template:`<div>{{message}}</div>`,
    data(){
        return{
            message:this.$route.params.name
        }
    }
}
const router = new VueRouter({
    mode:'history',
      routes:[
      {path:'/home',component:Home},
      {path:'/home/:name',component:Home}
      ]
})
new Vue({
    el:'#app',
    router
})

上段代碼中,我們?cè)诼酚蓸?gòu)建選項(xiàng)routes中配置了一個(gè)動(dòng)態(tài)路由’/home/:name’,他們共用一個(gè)路由組件Home,這代表他們復(fù)用RouterView。

當(dāng)進(jìn)行路由切換時(shí),頁面只會(huì)渲染第一次路由匹配到的參數(shù),之后再進(jìn)行路由切換時(shí),message是沒有變化的。

②場景:

<div id="app">
  <ul>
    <li><router-link to="/home/foo">To Foo</router-link></li>    
    <li><router-link to="/home/baz">To Baz</router-link></li>    
    <li><router-link to="/home/bar">To Bar</router-link></li>    
  </ul>    
  <router-view></router-view>
</div>
const Home = {
  template: `<div>{{message}}</div>`,
  data() {
    return {
      message: this.$route.params.name
    }
  }
}
 
const router = new VueRouter({
  mode:'history',
    routes: [
    {path: '/home', component: Home },
    {path: '/home/:name', component: Home }
  ]
})
 
new Vue({
  el: '#app',
  router
})

上段代碼中,我們?cè)诼酚蓸?gòu)建選項(xiàng)routes中配置了一個(gè)動(dòng)態(tài)路由’/home:/name’,它們共用一個(gè)路由組件Home,這代表他們復(fù)用RouterView。

當(dāng)進(jìn)行路由切換時(shí),頁面只會(huì)渲染第一次路由匹配到的參數(shù),之后再進(jìn)行路由切換時(shí),message是沒有變化的。

③解決辦法:

解決辦法有很多種,這里只列舉我常用到的幾種方法。

1.通過watch監(jiān)聽$route的變化:


const Home = {
  template: `<div>{{message}}</div>`,
  data() {
    return {
      message: this.$route.params.name
    }
  },
  watch:{
     '$route':function(){
        this.message = this.$route.params.name
     }
  }
}
...
new Vue({
  el: '#app',
  router
})

2.給綁定key屬性,這樣vue就會(huì)認(rèn)為這是不同的。

弊端:如果從/home跳轉(zhuǎn)到/user等其他路由下,我們是不用擔(dān)心組件更新問題的,所以這個(gè)時(shí)候key屬性是多余的。
<div id="app">
  ...
  <router-view :key="key"></router-view>
</div>

二、本人常用的方法:

  1. 給dom綁定key值,然后數(shù)據(jù)更新,再更改key值,這樣可以解決

  1. 強(qiáng)制刷新

  1. set,delete,Object.assign()等方法

  1. this.$nextTick(() => {

})

版權(quán)聲明:本文為CSDN博主「_攬」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/qq_59747594/article/details/128216340文章來源地址http://www.zghlxwxcb.cn/news/detail-507927.html

到了這里,關(guān)于2023.3.22 Vue 數(shù)據(jù)更新了但頁面沒有更新的情況的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(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)文章

  • Pinia 刷新頁面store數(shù)據(jù)更新頁面沒有變化,響應(yīng)式失效

    當(dāng)我在組件的 setup 中使用 useStore 來獲取 store 的時(shí)候,Pinia.js 的 store 已經(jīng)被更新了,但是組件渲染沒變化。 當(dāng)count我們?cè)诮Y(jié)構(gòu)賦值的時(shí)候數(shù)據(jù)丟失了響應(yīng)式 1.計(jì)算屬性 2.使用storeToRefs

    2024年02月11日
    瀏覽(19)
  • vue3中數(shù)據(jù)更新,視圖沒有更新解決方案

    Vue 3.0 中我們使用 reactive() 定義的 響應(yīng)式 數(shù)據(jù)的時(shí)候,當(dāng)我們對(duì)象再次賦值,我們發(fā)現(xiàn)數(shù)據(jù)已經(jīng)修改成功,但是頁?并沒有自動(dòng)渲染成最新的數(shù)據(jù); 使用vue的強(qiáng)制刷新處理 scriptsetup import {defineComponent , ref , computed , toRefs , getCurrentInstance} from \\\'vue\\\' constinternalInstance = getCurrentIns

    2024年02月17日
    瀏覽(29)
  • vue3中數(shù)據(jù)更新了,但是視圖沒有更新的5中方案

    vue 3.0 ref 和 Reactive 數(shù)據(jù)響應(yīng)式,以及使用 Reactive 數(shù)據(jù)已更新但頁面沒有同步刷新異常 方案1:Vue 3.0 中我們使用 reactive() 定義的響應(yīng)式數(shù)據(jù)的時(shí)候,當(dāng)我們對(duì)象再次賦值,我們發(fā)現(xiàn)數(shù)據(jù)已經(jīng)修改成功,但是頁?并沒有自動(dòng)渲染成最新的數(shù)據(jù); 這時(shí)我們可以改成 ref () 或者對(duì)

    2024年01月18日
    瀏覽(27)
  • 在layui中使用vue,使用vue進(jìn)行頁面數(shù)據(jù)部分?jǐn)?shù)據(jù)更新

    在layui中使用vue,使用vue進(jìn)行頁面數(shù)據(jù)部分?jǐn)?shù)據(jù)更新

    layui是一款非常優(yōu)秀的框架,使用也非常的廣泛,許多后臺(tái)管理系統(tǒng)都使用layui,簡單便捷,但是在涉及頁面部分?jǐn)?shù)據(jù)變化,就比較難以處理,比如一個(gè)頁面一個(gè)提交頁,提交之后部分?jǐn)?shù)據(jù)實(shí)時(shí)進(jìn)行更新,根據(jù)數(shù)據(jù)動(dòng)態(tài)控制元素顯示等。這些情況使用layui就需要自己用原始js方

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

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

    在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存在一些 局限性 :(官方的描述) 原因就是reactive函數(shù)會(huì)返回一個(gè)

    2024年02月13日
    瀏覽(33)
  • NextCloud 全新安裝后不能出現(xiàn)登錄頁面,可以打開登錄界面并在確定密碼沒有錯(cuò)誤的情況下卻無法登錄問題的解決

    NextCloud 全新安裝后不能出現(xiàn)登錄頁面,可以打開登錄界面并在確定密碼沒有錯(cuò)誤的情況下卻無法登錄問題的解決

    ?主要問題:全新安裝的nextcloud時(shí),會(huì)出現(xiàn)過一會(huì),安裝頁面出現(xiàn)錯(cuò)誤;靜等到一切安裝完成,輸入地址,卻出現(xiàn)404錯(cuò)誤的問題;還有在進(jìn)入登錄頁面后,在確定密碼沒有錯(cuò)誤的情況下,無法通過web頁面登錄;登錄次數(shù)過多后,因防暴力試錯(cuò)破解機(jī)制,導(dǎo)致延遲登錄。本文將解

    2024年02月05日
    瀏覽(27)
  • Vue + Element UI 實(shí)現(xiàn)復(fù)制當(dāng)前行數(shù)據(jù)功能(復(fù)制到新增頁面組件值不能更新等問題解決)

    使用Vue + Element UI 實(shí)現(xiàn)在列表的操作欄新增一個(gè)復(fù)制按鈕,復(fù)制當(dāng)前行的數(shù)據(jù)可以打開新增彈窗后亦可以跳轉(zhuǎn)到新增頁面,本文實(shí)現(xiàn)為跳轉(zhuǎn)到新增頁面。 方法部分:用id來區(qū)分,正常新增id為0,復(fù)制id不為0 按上述代碼操作后,點(diǎn)擊列表操作欄的復(fù)制按鈕會(huì)跳轉(zhuǎn)到新增頁面并且

    2024年02月05日
    瀏覽(20)
  • vue2引入Element UI組件去創(chuàng)建新的頁面的詳細(xì)步驟

    vue2引入Element UI組件去創(chuàng)建新的頁面的詳細(xì)步驟

    目錄 一、Element UI介紹 Element UI的特點(diǎn): 二、下載配置Element UI (零)創(chuàng)建vue項(xiàng)目 (一)下載Element UI依賴?? (二)全局文件main.js中引入Element UI 三、刪除多余的東西? (一)刪除App.vue多余的? (二)刪除多余的頁面? (三)刪除router路由多余的? 四、新建vue頁面 (一)新建

    2024年02月14日
    瀏覽(20)
  • Vue + Element UI 實(shí)現(xiàn)復(fù)制當(dāng)前行數(shù)據(jù)功能及解決復(fù)制到新增頁面組件值不更新的問題

    Vue + Element UI 實(shí)現(xiàn)復(fù)制當(dāng)前行數(shù)據(jù)功能及解決復(fù)制到新增頁面組件值不更新的問題

    Vue + Element UI 實(shí)現(xiàn)復(fù)制當(dāng)前行數(shù)據(jù)功能及解決復(fù)制到新增頁面組件值不更新的問題 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:AIGC人工智能 ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技

    2024年02月04日
    瀏覽(24)
  • 2023.04.22更新大麥網(wǎng)移動(dòng)端/M端搶購軟件和使用教程

    近期發(fā)現(xiàn)大麥網(wǎng)頁端搶購頁面悄然發(fā)生變化,之前可以在頁面選擇票價(jià)、檔次,并且點(diǎn)擊按鈕進(jìn)行購票,現(xiàn)在不行了,并且有些票只能在APP端購買,因此針對(duì)性編寫了代碼來適配。 新的代碼中首先進(jìn)行了如下改造。 構(gòu)造下單地址。之前是需要在購票地址頁面點(diǎn)擊按鈕進(jìn)行跳

    2024年02月11日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包