Vue中重新渲染组件的方法总结
作者:互联网
有时Vue的反应性系统还不够,您只需要重新渲染组件即可。 重新渲染组件有以下几个办法:
-
可怕的方法:重新加载整个页面
-
可怕的方法:使用
v-if
-
更好的方法:使用Vue的内置
forceUpdate
方法 -
最好的方法:在组件上进行
key
更改
重新加载整个页面
非常不建议这样做,我们来看下一个办法
v-if
指令,该指令仅在组件为true时才渲染。 如果为false,则该组件在DOM中不存在。 下面我们设置它以使其v-if
能够正常工作的方式。
在您的template,您将添加v-if
指令:
<template>
<my-component v-if="renderComponent" />
</template>
123
script
您将添加使用以下方法nextTick
:
<script>
export default {
data() {
return {
renderComponent: true,
};
},
methods: {
forceRerender() {
// 从 DOM 中删除 my-component 组件
this.renderComponent = false;
this.$nextTick(() => {
// 在 DOM 中添加 my-component 组件
this.renderComponent = true;
});
}
}
};
</script>
1234567891011121314151617181920
这里发生的事情:
-
最初
renderComponent
设置为true,因此my-component组件渲染
-
在
forceRerender
中我们立即设置renderComponent
为false
-
停止渲染组件
my-component
,因为该v-if
指令现在的值为false
-
在
nextTick
中将renderComponent
上设置回true
-
现在该
v-if
结果为true
,因此我们my-component
再次开始渲染
我们必须等到nextTick,否则我们不会看到任何变化。
在Vue中,一个nextTick
是一个DOM更新周期。Vue将收集在同一 nextTick 中进行的所有更新,在 nextTick 结束时,它将根据这些更新来渲染 DOM 中的内容。如果我们不等到nextTick,我们对renderComponent
的更新就会自动取消,什么也不会改变。
其次,当我们第二次渲染时,Vue将创建一个全新的组件。 Vue 将销毁第一个,并创建一个新的,这意味着我们的新my-component将像正常情况一样经历其所有生命周期-created,mounted等。
不过,这并不是一个很好的解决方案,往下看
使用forceUpdate
这是解决此问题的两种最佳方法之一,此方法得到Vue的官方支持。
forceUpdate
在组件实例本身以及全局实例上,可以通过两种不同的方式调用
// 全局
import Vue from 'vue';
Vue.forceUpdate();
// 使用组件实例
export default {
methods: {
methodThatForcesUpdate() {
// ...
this.$forceUpdate();
// ...
}
}
}
1234567891011121314
重要提示:这不会更新您拥有的任何计算属性。调用forceUpdate
只会强制重新渲染视图
最好的方法:修改组件的key达到组件重新渲染
在许多情况下,我们需要重新渲染组件。
要正确地做到这一点,我们将提供一个key
属性,以便 Vue
知道特定的组件与特定的数据片段相关联。如果key
保持不变,则不会更改组件,但是如果key
发生更改,Vue
就会知道应该删除旧组件并创建新组件。
我们可以采用这种将key
分配给子组件的策略,但是每次想重新渲染组件时,只需更新该key
即可。
<template>
<component-to-re-render :key="componentKey" />
</template>
export default {
data() {
return {
componentKey: 0,
};
},
methods: {
forceRerender() {
this.componentKey += 1;
}
}
}
1234567891011121314151617
每次 forceRerender
被调用时,我们的componentKey
都会改变。当这种情况发生时,Vue将知道它必须销毁组件并创建一个新组件。我们得到的是一个子组件,它将重新初始化自身并“重置”其状态。
标签:nextTick,Vue,渲染,renderComponent,key,组件 来源: https://www.cnblogs.com/gao-ze/p/16244709.html