位置: IT常识 - 正文

✝️ 强制 Vue 重新渲染组件的正确方法

编辑:rootadmin
✝️ 强制 Vue 重新渲染组件的正确方法

推荐整理分享✝️ 强制 Vue 重新渲染组件的正确方法,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

有时 Vue 的 reactivity 不符合需求,你需要重新渲染一个组件,或者可能只是想remove当前的 DOM 并 re-render。那么如何让 Vue 以正确的方式重新加载组件呢?

强制 Vue 重新渲染组件的最佳方法是在组件上设置一个:key。当需要重新渲染组件时,只需更改键的值,Vue 就会重新渲染组件。

这称为Key-Changing Technique,这是一个非常简单的解决方案,让我们看看还有其他的解决方案吧。

在这篇文章中,我们将看看解决这个问题的方法,这些方法在 Vue 2 和 Vue 3 中都有效:

❌ 方式1:重新加载整个页面🔪 方法2:使用v-if hack👌 方法3:使用 Vue 内置的forceUpdate方法✅ 方法4:使用 Key-Changing Technique 来刷新你的组件❌ 方式1:重新加载整个页面

reload,这没啥好说了,也不建议这样做。

🔪 方法2:使用v-if hack

一个稍微好一点的解决方案是巧妙地使用v-if指令。

在代码中,将在要重新加载的组件上添加指令:v-if

<template><MyComponent v-if="renderComponent" /> </template>

script setup 中可以添加 forceRerender方法,然后使用 nextTick:

import { nextTick, ref } from 'vue';const renderComponent = ref(true);const forceRerender = async () => { // Remove MyComponent from the DOM renderComponent.value = false;// Wait for the change to get flushed to the DOMawait nextTick();// Add the component back in renderComponent.value = true;};

Options API 的写法:

export default { data() { return { renderComponent: true, }; }, methods: { async forceRerender() { // Remove MyComponent from the DOM this.renderComponent = false;// Wait for the change to get flushed to the DOM await this.$nextTick(); // Add the component back in this.renderComponent = true; } }};

执行流程:

最初renderComponent设置为true,因此MyComponent呈现当调用forceRerender时,set renderComponent为falseMyComponent组件消失,因为renderComponent为false然后 nextTick,renderComponent回到true重新开始渲染一个刷新的实例 MyComponent

有两部分对于理解其工作原理很重要。

首先,next tick,才能看到变化。

在 Vue 中,一个 tick 是一个单一的 DOM 更新周期。Vue 将收集在同一个 tick 中进行的所有更新,并且在 tick 结束时,它将根据这些更新更新渲染到 DOM 中的内容。

✝️ 强制 Vue 重新渲染组件的正确方法

如果没等到next tick,更新renderComponent将自行取消,什么都不会改变。

其次,当第二次渲染时, Vue 将创建一个全新的组件,因为 Vue 会销毁第一个并创建一个新的。这意味着newMyComponent将像往常一样经历它的所有生命周期—— created、mounted等等。

这可行,但这不是一个很好的解决方案,我称之为 hack,因为我们正在围绕 Vue 希望我们做的事情进行 hack。

👌 方法3:使用 Vue 内置的forceUpdate方法

这是解决这个问题的两种最佳方法之一,这两种方法都得到了 Vue 的官方支持。

通常,Vue 会通过更新视图来响应依赖项的变化。但是,当调用forceUpdate 时,可以强制进行更新,即使实际上没有任何依赖项发生更改。

这绕过了Vue的reactivity,这就是为什么不推荐将其作为解决方案的原因。

但有时,Vue的reactivity 会令人困惑,有时候我们认为 Vue 会对某个属性或变量的变化做出反应,但事实并非如此。如果使用的是 Vue 2,在某些情况下,Vue 的反应系统根本不会检测到任何更改。但是 Vue 3 有一个更强大的基于代理的反应系统,基本不会遇到这些相同的问题。

以下是forceUpdate使用 Options API 调用的方法:

export default { methods: { methodThatForcesUpdate() { this.$forceUpdate(); } }}

在 Vue 3 中使用 Composition API 调用:

import { getCurrentInstance } from 'vue';const methodThatForcesUpdate = () => { const instance = getCurrentInstance(); instance.proxy.forceUpdate();};

重要提示:调用forceUpdate只会强制视图重新渲染。

✅ 方法4:使用 Key-Changing Technique 来刷新你的组件

在许多情况下,会强制刷新组件的需求。为了以正确的方式做到这一点,我们将提供一个key属性,以便 Vue 知道特定的组件与特定的数据片段相关联。如果 key 保持不变,它不会改变组件,但如果 key 确实改变了,Vue 知道它应该销毁旧组件并创建一个新组件。

这是强制 Vue 刷新组件的最佳方式(在我看来)。

我们向组件添加一个key属性,然后在需要重新渲染组件时更改该键。

这是一个非常基本的方法script setup:

<template> <MyComponent :key="componentKey" /></template>import { ref } from 'vue';const componentKey = ref(0);const forceRerender = () => { componentKey.value += 1;};

Options API 的写法:

export default { data() { return { componentKey: 0, }; }, methods: { forceRerender() { this.componentKey += 1; } }}

每次forceRerender调用时componentKey都会改变。发生这种情况时,Vue 将知道它必须销毁组件并创建一个新组件。你得到的是一个子组件,它将重新初始化自身并“重置”它的状态,强制刷新并重新渲染组件。

请记住,如果您发现自己需要强制 Vue 重新渲染组件,可能有更好的方法。

但是,如果确实需要重新渲染某些内容,请选择 Key-Changing Technique。

本文链接地址:https://www.jiuchutong.com/zhishi/288863.html 转载请保留说明!

上一篇:罗弗敦群岛的北极冲浪之旅,挪威罗弗敦大师赛 (© Nicolás Pina/Tandem Stills + Motion)(挪威罗弗敦岛)

下一篇:梵净山,中国西南部 (© zhuxiaophotography/Shutterstock)(梵净山原名)

  • 苹果手机可以用别的蓝牙耳机吗(苹果手机可以用nfc功能吗)

    苹果手机可以用别的蓝牙耳机吗(苹果手机可以用nfc功能吗)

  • vivox30网速卡的原因(vivox30网速慢)

    vivox30网速卡的原因(vivox30网速慢)

  • 如何更新显卡驱动(如何更新显卡驱动程序win7)

    如何更新显卡驱动(如何更新显卡驱动程序win7)

  • 微信语音和视频邀请通知关闭了怎么办(微信语音和视频邀请没有声音咋回事)

    微信语音和视频邀请通知关闭了怎么办(微信语音和视频邀请没有声音咋回事)

  • qq群主如何禁言群成员(qq群主如何禁言成员)

    qq群主如何禁言群成员(qq群主如何禁言成员)

  • 三星s20ultra怎么截屏(三星s20ultra怎么缩小屏幕)

    三星s20ultra怎么截屏(三星s20ultra怎么缩小屏幕)

  • 为什么有的淘宝订单没有交易快照(为什么有的淘宝店铺买完东西就消失了)

    为什么有的淘宝订单没有交易快照(为什么有的淘宝店铺买完东西就消失了)

  • 华为nova7介绍(华为nova7手机介绍)

    华为nova7介绍(华为nova7手机介绍)

  • 安卓充电器有几种(安卓充电器有几种端口)

    安卓充电器有几种(安卓充电器有几种端口)

  • 华为字体可以加粗吗(华为字体加粗软件)

    华为字体可以加粗吗(华为字体加粗软件)

  • 字体加黑怎么弄(字体加黑怎么弄成白色)

    字体加黑怎么弄(字体加黑怎么弄成白色)

  • vivo手机充电越充越少怎么办(vivo手机充电越充越少怎么解决视频)

    vivo手机充电越充越少怎么办(vivo手机充电越充越少怎么解决视频)

  • QQ号被盗的原因(qq号被盗是因为什么原因)

    QQ号被盗的原因(qq号被盗是因为什么原因)

  • 怎么分享微信聊天记录(怎么分享微信聊天记录长图)

    怎么分享微信聊天记录(怎么分享微信聊天记录长图)

  • 可以看电视剧的软件有哪些(可以看电视剧的公众号)

    可以看电视剧的软件有哪些(可以看电视剧的公众号)

  • ctrl+f4的功能是什么(ctrl+f4的作用)

    ctrl+f4的功能是什么(ctrl+f4的作用)

  • bkl-al00是什么版本(bbk al00什么型号)

    bkl-al00是什么版本(bbk al00什么型号)

  • 拼多多场景推广啥意思(拼多多场景推广是什么意思)

    拼多多场景推广啥意思(拼多多场景推广是什么意思)

  • y97怎样调出返回键(y97怎样调出返回按键)

    y97怎样调出返回键(y97怎样调出返回按键)

  • 怎样查看点赞人的qq号(如何查看点赞的人)

    怎样查看点赞人的qq号(如何查看点赞的人)

  • 微信记账本在哪里(微信怎么查以前转账记录)

    微信记账本在哪里(微信怎么查以前转账记录)

  • 双行合一排版格式(双行合一的排版格式怎么设置2016)

    双行合一排版格式(双行合一的排版格式怎么设置2016)

  • DevTools 无法加载来源映射:无法加载 chrome-extension: 警告的原因以及如何去除(全网最全 最详细解决方案)(devtools无法加载源映射less.map)

    DevTools 无法加载来源映射:无法加载 chrome-extension: 警告的原因以及如何去除(全网最全 最详细解决方案)(devtools无法加载源映射less.map)

  • 交城市维护建设税填什么凭证
  • 小规模纳税人减征额怎么计算
  • 附加税费用怎么算
  • 有主营业务收入就一定有销项税吗
  • 购房尾款发票什么时候开
  • 生鲜配送公司财务制度
  • 充电桩收入属于什么类别
  • 发票认证抵扣后还有用吗
  • 高铁票抵扣进项税
  • 开广告公司需要营业执照吗
  • 研究开发费用的归集
  • 免税农产品如何填报企业所得税季报
  • 印刷品生产需要生产许可证吗?
  • 虚开费用发票入账
  • 小规模纳税人是简易计税吗
  • 滴滴 增值税
  • 该纳税人不属于经备案的二手车企业
  • 增值税进项发票网上勾选平台
  • 安装固定资产领用原材料
  • 旅游业营改增差额征税的会计核算怎么做?
  • 城市维护建设税属于什么税种
  • 进口付汇核销流程
  • 税务发票原件
  • 企业所得税年报和增值税收入不一致
  • 本月做账下月认证的进项怎么做账?
  • 上个月的流量这个月可以用吗
  • 清除文件夹exe病毒工具
  • 餐费发票可以抵扣成本吗
  • 重装系统前需要注意什么
  • linux常见的文本编辑工具有哪些
  • 销售合同怎么计算印花税
  • 赖格宝视频
  • 企业合并进行过程中发生的各项直接相关费用
  • yii2框架的优缺点
  • vue如何销毁页面
  • 浅谈php中类和对象的区别
  • php修改头像
  • 分配利润的会计处理
  • 安装多版本chrome
  • 蓝桥杯b组2020
  • iis搭建网站教程win10
  • 帝国cms app
  • libpcap python
  • Packaging a Qt application
  • 开票品名不一样有什么关系
  • mongodb操作语句
  • 免税农产品有哪些类型
  • 新会计准则规定
  • 未开票的收入如何申报增值税
  • 印花税处罚适用征管法六十四条规定
  • 广告费和业务宣传费
  • 开出去的发票没有进项发票应如何核算成本?
  • 发货快递费多少钱
  • 预提费用为什么是负债
  • 母公司与子公司税务关系
  • 补开以前年度发票
  • 小规模纳税人如何申请专票
  • 经营所得与劳务所得的直别
  • 账簿按账页格式排序
  • win8任务管理器快捷键
  • win10系统怎么设置电脑密码
  • ubuntu怎样调出命令行
  • win10 ie无法使用
  • macbookzen
  • msoobe.exe是什么
  • 怎么在手机上买股票开户
  • win7电脑弹窗多怎么解决
  • Win10系统怎么截图快捷键
  • 框架常用注解
  • JavaScript的setter与getter方法
  • 滑动到点击位置的快捷键
  • pycharm官方教程
  • python2网络编程
  • 细说javascript
  • 网页中实现浏览的快捷键
  • jquery教程
  • 安徽省国家税务局网上办税平台
  • 不能抵扣消费税口诀
  • 税控系统技术维护费每年都要交吗
  • 河北税务交社保显示未找到对应的城乡居民应缴费额配置
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设