Vue中$forceUpdate()的使用方式
$forceUpdate()的使用
在Vue官方文檔中指出,$forceUpdate具有強制刷新的作用。

那在vue框架中,如果data中有一個變量:age,修改他,頁面會自動更新。
但如果data中的變量為數(shù)組或對象,我們直接去給某個對象或數(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對象修改值,發(fā)現(xiàn)頁面其實并沒有變化
有兩種解決方法
方法一
methods:{
updateName(){
this.userInfo.name='小紅'//在此時,確實已經(jīng)將userInfo對象修改完成
console.log(this.userInfo.name);//輸出結果: 小紅
this.$forceUpdate();//在這里,強制刷新之后,頁面的結果變?yōu)?小紅'
}
}
方法二
methods:{
updateName(){
this.$set('userInfo',name,'小紅');
}
}
關于$forceUpdate的一些理解
在官方文檔上僅僅有這一句話
迫使 Vue 實例重新渲染。注意它僅僅影響實例本身和插入插槽內容的子組件,而不是所有子組件。
我的理解是,所謂重新渲染,僅僅是指重新渲染DOM并與原有的DOM做code diff。對于有變更的,渲染到頁面。結合官方解釋,可以確認有兩點不會發(fā)生:
- 不會重新觸發(fā)生命周期鉤子函數(shù),比如mounted
- 不會渲染子組件的更新,即使子組件的props發(fā)生改變了。
既然如此,什么場景下會需要使用呢?
我們知道,在Vue中,響應數(shù)據(jù)發(fā)生改變后,會自動觸發(fā)更新,但有一些條件,不會觸發(fā)更新,比如數(shù)組的一些方法,或者添加data中并未提前定義的響應式數(shù)據(jù)。
舉個例子:
假設有一個列表需要渲染,我們在data中初始化了這個列表,并在mounted函數(shù)中通過fill去填充這個數(shù)組。fill這個api是不會觸發(fā)自動更新的。
<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);
? },在上面的示例中,頁面會在3秒后才看到更新,子組件會在5秒后看到更新。這也就解釋了forceUpdate的含義。
即強制更新因某些原因并未渲染到頁面的,已經(jīng)改變的,應該被渲染到頁面的數(shù)據(jù)。
他所影響的僅僅是【觸發(fā)render函數(shù)生成DOM -> 與原DOM 進行diff -> 更新視圖】這個過程。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
一個vue組件庫發(fā)布到npm的完整實現(xiàn)過程
工作的時候總是使用別人的npm包,然而我有時心底會好奇自己如何發(fā)布一個npm包呢,什么時候自己的包能夠被很多人喜歡并使用呢,下面這篇文章主要給大家介紹了關于一個vue組件庫發(fā)布到npm的相關資料,需要的朋友可以參考下2022-03-03
vue項目中vue-i18n和element-ui國際化開發(fā)實現(xiàn)過程
這篇文章主要介紹了vue項目中vue-i18n和element-ui國際化開發(fā)實現(xiàn)過程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-04-04
vue中axios利用blob實現(xiàn)文件瀏覽器下載方式
這篇文章主要介紹了vue中axios利用blob實現(xiàn)文件瀏覽器下載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

