Vue中$forceUpdate()的使用方式
$forceUpdate()的使用
在Vue官方文檔中指出,$forceUpdate具有強(qiáng)制刷新的作用。
那在vue框架中,如果data中有一個(gè)變量:age,修改他,頁(yè)面會(huì)自動(dòng)更新。
但如果data中的變量為數(shù)組或?qū)ο?,我們直接去給某個(gè)對(duì)象或數(shù)組添加屬性,頁(yè)面是識(shí)別不到的
<template> <p>{{userInfo.name}}</p> <button @click="updateName">修改userInfo</button> </template>
<script> data(){ return{ userInfo:{name:'小明'} } }, methods:{ updateName(){ this.userInfo.name='小紅' } } </script>
在updateName函數(shù)中,我們嘗試給userInfo對(duì)象修改值,發(fā)現(xiàn)頁(yè)面其實(shí)并沒有變化
有兩種解決方法
方法一
methods:{ updateName(){ this.userInfo.name='小紅'//在此時(shí),確實(shí)已經(jīng)將userInfo對(duì)象修改完成 console.log(this.userInfo.name);//輸出結(jié)果: 小紅 this.$forceUpdate();//在這里,強(qiáng)制刷新之后,頁(yè)面的結(jié)果變?yōu)?小紅' } }
方法二
methods:{ updateName(){ this.$set('userInfo',name,'小紅'); } }
關(guān)于$forceUpdate的一些理解
在官方文檔上僅僅有這一句話
迫使 Vue 實(shí)例重新渲染。注意它僅僅影響實(shí)例本身和插入插槽內(nèi)容的子組件,而不是所有子組件。
我的理解是,所謂重新渲染,僅僅是指重新渲染DOM并與原有的DOM做code diff。對(duì)于有變更的,渲染到頁(yè)面。結(jié)合官方解釋,可以確認(rèn)有兩點(diǎn)不會(huì)發(fā)生:
- 不會(huì)重新觸發(fā)生命周期鉤子函數(shù),比如mounted
- 不會(huì)渲染子組件的更新,即使子組件的props發(fā)生改變了。
既然如此,什么場(chǎng)景下會(huì)需要使用呢?
我們知道,在Vue中,響應(yīng)數(shù)據(jù)發(fā)生改變后,會(huì)自動(dòng)觸發(fā)更新,但有一些條件,不會(huì)觸發(fā)更新,比如數(shù)組的一些方法,或者添加data中并未提前定義的響應(yīng)式數(shù)據(jù)。
舉個(gè)例子:
假設(shè)有一個(gè)列表需要渲染,我們?cè)赿ata中初始化了這個(gè)列表,并在mounted函數(shù)中通過fill去填充這個(gè)數(shù)組。fill這個(gè)api是不會(huì)觸發(fā)自動(dòng)更新的。
<template> ? <div class="hello"> ? ? <div> ? ? ? <span v-for="(item, index) in arr" :key="index">{{ item }}</span> ? ? </div> ? ? <hello-world ref="hello" :list="arr" /> ? </div> </template>
<script> import HelloWorld from "@/components/HelloWorld.vue"; export default { ? name: "About", ? components: { ? ? HelloWorld, ? }, ? data() { ? ? return { ? ? ? arr: Array(4), ? ? }; ? }, ? mounted() { ? ? this.arr.fill(0); ? ? setTimeout(() => { ? ? ? this.$forceUpdate(); ? ? }, 3000); ? ? setTimeout(() => { ? ? ? this.$refs.hello.$forceUpdate();; ? ? }, 5000); ? },
在上面的示例中,頁(yè)面會(huì)在3秒后才看到更新,子組件會(huì)在5秒后看到更新。這也就解釋了forceUpdate的含義。
即強(qiáng)制更新因某些原因并未渲染到頁(yè)面的,已經(jīng)改變的,應(yīng)該被渲染到頁(yè)面的數(shù)據(jù)。
他所影響的僅僅是【觸發(fā)render函數(shù)生成DOM -> 與原DOM 進(jìn)行diff -> 更新視圖】這個(gè)過程。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue-week-picker實(shí)現(xiàn)支持按周切換的日歷
這篇文章主要為大家詳細(xì)介紹了vue-week-picker實(shí)現(xiàn)支持按周切換的日歷,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Vue實(shí)現(xiàn)模糊查詢filter()實(shí)例詳解
因?yàn)榻赵趯W(xué)習(xí)并使用VUE,客戶有一個(gè)要求,要輸入框可模糊查詢并帶有下拉提示的應(yīng)用,數(shù)據(jù)從接口取,下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)模糊查詢filter()的相關(guān)資料,需要的朋友可以參考下2023-04-04vue基礎(chǔ)之事件簡(jiǎn)寫、事件對(duì)象、冒泡、默認(rèn)行為、鍵盤事件實(shí)例分析
這篇文章主要介紹了vue基礎(chǔ)之事件簡(jiǎn)寫、事件對(duì)象、冒泡、默認(rèn)行為、鍵盤事件,結(jié)合實(shí)例形式分析了vue.js事件簡(jiǎn)寫、冒泡及阻止冒泡等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03詳解vue中在父組件點(diǎn)擊按鈕觸發(fā)子組件的事件
這篇文章主要介紹了詳解vue中在父組件點(diǎn)擊按鈕觸發(fā)子組件的事件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11