位置: 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)(梵净山原名)

  • 手机dns在哪里修改(手机dns怎么填写才正确)

    手机dns在哪里修改(手机dns怎么填写才正确)

  • 小米mix3万象息屏如何设置(小米万象息屏显示时间怎么设置)

    小米mix3万象息屏如何设置(小米万象息屏显示时间怎么设置)

  • vivo手机充电特效怎么设置(vivo手机充电特别烫)

    vivo手机充电特效怎么设置(vivo手机充电特别烫)

  • ipad访问限制密码初始是多少(iPad访问限制密码忘了)

    ipad访问限制密码初始是多少(iPad访问限制密码忘了)

  • 不让别人下载我的抖音视频怎么弄(不让别人下载我的抖音视频怎么设置)

    不让别人下载我的抖音视频怎么弄(不让别人下载我的抖音视频怎么设置)

  • 拉黑再删除还能加吗(拉黑再删除还能加上微信吗)

    拉黑再删除还能加吗(拉黑再删除还能加上微信吗)

  • 快手怎么自己添加位置(快手怎么自己添加表情包)

    快手怎么自己添加位置(快手怎么自己添加表情包)

  • word水绿色怎么设置(word水绿色怎么调rgb)

    word水绿色怎么设置(word水绿色怎么调rgb)

  • 关注了别人又取消别人看得到吗(关注了别人又取关会被发现吗)

    关注了别人又取消别人看得到吗(关注了别人又取关会被发现吗)

  • 打印机一直打印停不下来怎么办(打印机一直打印测试页怎么办)

    打印机一直打印停不下来怎么办(打印机一直打印测试页怎么办)

  • iphone xs max死机怎么办(iphone xs max死机重启)

    iphone xs max死机怎么办(iphone xs max死机重启)

  • 此账户无法使用这台ps4(此账户无法使用这台ps4 38496)

    此账户无法使用这台ps4(此账户无法使用这台ps4 38496)

  • 荣耀20和荣耀20ro区别(荣耀20和荣耀20青春版手机壳一样吗)

    荣耀20和荣耀20ro区别(荣耀20和荣耀20青春版手机壳一样吗)

  • 怎么开通呼叫转移功能(怎么开通呼叫转接)

    怎么开通呼叫转移功能(怎么开通呼叫转接)

  • ipadpro4g和wifi区别(ipadpro2020wifi和4g哪个好)

    ipadpro4g和wifi区别(ipadpro2020wifi和4g哪个好)

  • word文档怎么锁定图片(word文档怎么锁定不能编辑)

    word文档怎么锁定图片(word文档怎么锁定不能编辑)

  • 怎么在word里面画横线(怎么在word里面插目录)

    怎么在word里面画横线(怎么在word里面插目录)

  • 陌陌可以随意定位吗(陌陌可以随意定位位置吗)

    陌陌可以随意定位吗(陌陌可以随意定位位置吗)

  • 苹果xr死机了怎么强制重启(苹果xr死机了咋办)

    苹果xr死机了怎么强制重启(苹果xr死机了咋办)

  • 探探头像需要审核多久才能通过(探探头像需要审核多久)

    探探头像需要审核多久才能通过(探探头像需要审核多久)

  • qq面板在哪里打开(qq面板系统设置在哪里)

    qq面板在哪里打开(qq面板系统设置在哪里)

  • linux 账户管理命令 useradd、groupadd使用方法(linux管理员账户名)

    linux 账户管理命令 useradd、groupadd使用方法(linux管理员账户名)

  • phpcms忘记密码怎么办(phpcms默认密码)

    phpcms忘记密码怎么办(phpcms默认密码)

  • 领备用金填什么单子
  • 实收资本何时交税
  • 投资收益科目在贷方
  • 高铁费可抵扣适用税吗
  • 政府基金如何开票
  • 企业购入办公桌和办公椅的核算
  • 以前年度已付的现金
  • 工业总产值怎么计算公式
  • 搬迁到新租赁厂房的费用入什么科目?
  • 长期合同收入与应收帐款如何处理?
  • 发票签收单怎么填
  • 个体工商户税务登记证需要什么资料
  • 甲供工程会计分录
  • 产值指的是财务报表哪个数值
  • 股东分红纳入社会保险吗
  • 企业法人不发工资合法吗
  • 增值税发票国家收几个点的钱
  • 现金短缺或溢余的账务处理业务题
  • 消费税的计算公式推导过程
  • 打开网页出现电脑标志
  • 销售利润率的计算公式Excel
  • 工程安装成本分录
  • 事业单位自筹基金有哪些
  • 汽车销售私下收客户红包
  • 公司装修费用如何入账
  • 临时工工资应该找人力资源要吗
  • 资本溢价是
  • 苹果语音备忘录怎么导出
  • mc office是什么意思
  • hotkey可以卸载吗
  • uniapp的css库
  • 企业通讯费管理办法
  • 中小企业发展专项资金
  • 爱丁堡几点天黑
  • 股东无偿投入的土地需要摊销吗
  • 其他应付款清账
  • 人工智能agi
  • 专家坐诊信息
  • 人脸口罩检测系统
  • 待抵扣进项税额的账务处理
  • 兼职工作是单位工作吗
  • 什么是社会团体组织
  • 辞退福利是短期还是长期
  • 购买增值税发票属于什么科目?
  • 企业所得税的成本怎么填?
  • 什么样的企业才算大企业
  • 工资薪金可以抵扣增值税吗
  • 代理记账公司账务很乱能接吗
  • 履约保证金打到个人账户合法吗
  • 无法收回的款项怎么记账
  • 材料成本多少合适
  • 工程施工与工程成本的区别
  • 现金流量结构分析表
  • 上月有留抵税额本月怎么申报
  • 商品销售成本的计算方法中,商品零售企业
  • mysql删除重复的id但各保留一个
  • select * from sp_who的解决方案
  • docker安装使用
  • 如何备份还原电脑系统
  • Windows Server 2008:手足之争下的赢家
  • 怎么在bios关闭软驱
  • win7系统安装教程不用u盘
  • ubuntu如何清理缓存
  • xp系统如何隐藏我的电脑
  • xp双系统怎么切换系统
  • 电脑主板驱动
  • windows8怎么设置开机启动项
  • Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
  • 批处理常用命令总结
  • bat批处理命令大全
  • error C2258: illegal pure syntax, must be '= 0'
  • fragment的context
  • 深入了解是啥意思
  • vue stylus
  • javax.net.ssl.SSLException: hostname in certificate didn't match:
  • javascript引用值
  • jquery 插件编写
  • 浙江省国家税务局总局官网
  • 土地流转需要什么材料
  • 城镇土地使用税优惠政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设