Vue中$forceUpdate()的使用方式
$forceUpdate()的使用
在Vue官方文档中指出,$forceUpdate具有强制刷新的作用。
那在vue框架中,如果data中有一个变量:age,修改他,页面会自动更新。
但如果data中的变量为数组或对象,我们直接去给某个对象或数组添加属性,页面是识别不到的
<template>
<p>{{userInfo.name}}</p>
<button @click="updateName">修改userInfo</button>
</template>
<script>
data(){
return{
userInfo:{name:'小明'}
}
},
methods:{
updateName(){
this.userInfo.name='小红'
}
}
</script>
在updateName函数中,我们尝试给userInfo对象修改值,发现页面其实并没有变化
有两种解决方法
方法一
methods:{
updateName(){
this.userInfo.name='小红'//在此时,确实已经将userInfo对象修改完成
console.log(this.userInfo.name);//输出结果: 小红
this.$forceUpdate();//在这里,强制刷新之后,页面的结果变为'小红'
}
}
方法二
methods:{
updateName(){
this.$set('userInfo',name,'小红');
}
}
关于$forceUpdate的一些理解
在官方文档上仅仅有这一句话
迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。
我的理解是,所谓重新渲染,仅仅是指重新渲染DOM并与原有的DOM做code diff。对于有变更的,渲染到页面。结合官方解释,可以确认有两点不会发生:
- 不会重新触发生命周期钩子函数,比如mounted
- 不会渲染子组件的更新,即使子组件的props发生改变了。
既然如此,什么场景下会需要使用呢?
我们知道,在Vue中,响应数据发生改变后,会自动触发更新,但有一些条件,不会触发更新,比如数组的一些方法,或者添加data中并未提前定义的响应式数据。
举个例子:
假设有一个列表需要渲染,我们在data中初始化了这个列表,并在mounted函数中通过fill去填充这个数组。fill这个api是不会触发自动更新的。
<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的含义。
即强制更新因某些原因并未渲染到页面的,已经改变的,应该被渲染到页面的数据。
他所影响的仅仅是【触发render函数生成DOM -> 与原DOM 进行diff -> 更新视图】这个过程。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341