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

  • 手机后盖脏了擦不掉怎么办(手机后盖很脏擦不掉)

    手机后盖脏了擦不掉怎么办(手机后盖很脏擦不掉)

  • 淘宝注销了还能恢复吗(淘宝注销了还能找回吗)

    淘宝注销了还能恢复吗(淘宝注销了还能找回吗)

  • 电脑很快就锁屏怎么回事(电脑很快就锁屏了)

    电脑很快就锁屏怎么回事(电脑很快就锁屏了)

  • 通过wpa2进行保护怎么办(通过wpa2进行保护连接不上热点车上)

    通过wpa2进行保护怎么办(通过wpa2进行保护连接不上热点车上)

  • 抖音留言怎么看不到(查看抖音留言)

    抖音留言怎么看不到(查看抖音留言)

  • 钉钉多久不审批会失效(钉钉多久不审批自动退出)

    钉钉多久不审批会失效(钉钉多久不审批自动退出)

  • qq互动标识有哪些(qq互动标识有哪些图片)

    qq互动标识有哪些(qq互动标识有哪些图片)

  • 苹果11音响怎么就一个响(苹果11音响怎么样)

    苹果11音响怎么就一个响(苹果11音响怎么样)

  • 腾讯云是腾讯的吗(腾讯云是腾讯的子公司吗)

    腾讯云是腾讯的吗(腾讯云是腾讯的子公司吗)

  • qq账号申诉是什么意思(qq账号申诉是什么)

    qq账号申诉是什么意思(qq账号申诉是什么)

  • 苹果6p声音太小怎么办(苹果6p声音太小怎么解决)

    苹果6p声音太小怎么办(苹果6p声音太小怎么解决)

  • 怎么把电子版照片换底色(电子版照片怎么弄成纸质版)

    怎么把电子版照片换底色(电子版照片怎么弄成纸质版)

  • 天猫买到残次品如何赔偿(网购买到残次品可以要求赔偿吗)

    天猫买到残次品如何赔偿(网购买到残次品可以要求赔偿吗)

  • 电脑锁屏密码忘记了怎么办(电脑锁屏密码忘了)

    电脑锁屏密码忘记了怎么办(电脑锁屏密码忘了)

  • realmex2pro支持双频GPS吗(realmex2支持双电信吗)

    realmex2pro支持双频GPS吗(realmex2支持双电信吗)

  • iOS13优化电池充电什么意思(ios13优化电池充电多久学会)

    iOS13优化电池充电什么意思(ios13优化电池充电多久学会)

  • 微信资料手机号怎么隐藏(微信资料手机号码)

    微信资料手机号怎么隐藏(微信资料手机号码)

  • 苹果xr耳机插哪里(苹果手机xr耳机插哪)

    苹果xr耳机插哪里(苹果手机xr耳机插哪)

  • shotonmi8是什么手机(shotonmi8手机的样子)

    shotonmi8是什么手机(shotonmi8手机的样子)

  • 怎样在芒果TV截取一段长视频(芒果tv怎么截屏)

    怎样在芒果TV截取一段长视频(芒果tv怎么截屏)

  • ppp-off命令  关闭ppp连线(终止pppoe会话)

    ppp-off命令 关闭ppp连线(终止pppoe会话)

  • 最强MacBook苹果笔记本macos电脑应用Sublime Text 4代码编辑器傻瓜汉化教程(哪一款macbook)

    最强MacBook苹果笔记本macos电脑应用Sublime Text 4代码编辑器傻瓜汉化教程(哪一款macbook)

  • 《笨办法学Python3 》PDF高清版入坑必备!!!(笨办法学python 3电子书下载)

    《笨办法学Python3 》PDF高清版入坑必备!!!(笨办法学python 3电子书下载)

  • 生产部的管理人员简介范文
  • 公对公打款开票
  • 出纳可以编制工资单吗
  • 公司注销是不是破产了
  • 汽车区域差价
  • 公司购入汽车分录
  • 车的违章处理
  • 现金存款账户
  • 欠税已经缴纳会影响征信吗
  • 小规模纳税人如何计算增值税
  • 利税总额为负数如何表述出来
  • 发票连号不许报销吗
  • 应收账款的产生之一是由于销售
  • 增值税有留底怎么申请退税
  • 财务报表申报错了怎么撤销
  • 委托加工物资成本计入
  • 出口报关单有什么用
  • 台式电脑开不了机怎么办 屏幕黑屏
  • PHP:pg_num_fields()的用法_PostgreSQL函数
  • 购入固定资产后海通融资怎么办
  • thinkphp操作数据库
  • 借款业务包括以下哪些形式
  • fsma32.exe进程是什么文件 fsma32是什么进程
  • 房地产开发企业增值税怎么算
  • 详解php字符串替换
  • 酒店损益类科目包括哪些
  • video.js教程
  • php操作json文件
  • 补缴房产税和土地使用税会计分录
  • chat top
  • 【超用心整理】Markdown常用语法介绍,看这一个就够了
  • 删除cmd命令记录
  • 售后租回交易的资产销售价低于市场价承租人作为
  • 分公司增值税可以放总公司一起缴纳吗
  • 非一般纳税人怎么报税
  • 除了增值税发票还有什么票可以抵扣税
  • 损益类科目明细账图片
  • 资产减值损失属于营业外支出吗
  • 其他综合收益涉及到的业务
  • javascript基础笔记
  • 跨季度的发票可以冲红吗
  • 申请高新技术企业要具备哪些条件
  • 费用报销单怎么填写
  • jdbc连接mysql数据库代码
  • 预充值发票可以报销吗
  • 预缴增值税后期如何处理
  • 融资租赁期间的维修费由谁承担
  • 异地办理税务登记需要什么资料
  • 现金解款单是什么
  • 其他收益和其他综合收益属于什么科目
  • 如果收到现金做账了还叫坐支
  • 汇算清缴补税的凭证后面需要附件吗
  • 房屋租赁合同印花税怎么计算
  • 私营公司融资租房合法吗
  • window系统怎么更新版本
  • win8/10whql
  • 最新bios界面
  • centos5.5网络配置
  • 组策略禁用u盘怎么打开
  • msoxmled.exe是什么软件
  • js实现下拉框联动
  • js操作list
  • 示例代码
  • perl linux命令
  • python读json文件和写json文件
  • jquery理解
  • nodejs重启
  • python文件rb
  • android 图片视频轮播框架
  • python用什么编辑
  • javascript中匿名函数
  • javascript面向对象精要pdf
  • 事件的分发与传播的关系
  • 土地增值税可否免税
  • 噼里啪啦财务公司加盟
  • 回购房 安置房
  • 管道运输企业的核心指标是
  • 税控盘百旺怎样清卡
  • 车间租金计入什么会计科目
  • 韩国工资多少人民币
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设