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

  • ppt艺术字文本效果在哪里(ppt艺术字文本效果转换在哪里设置)

    ppt艺术字文本效果在哪里(ppt艺术字文本效果转换在哪里设置)

  • iphone pro和max区别(苹果pro和max)

    iphone pro和max区别(苹果pro和max)

  • 微博钱包支付密码怎么设置(微博钱包支付密码是哪个密码)

    微博钱包支付密码怎么设置(微博钱包支付密码是哪个密码)

  • 怎么把快手变成夜间模式(怎么把快手变成大屏模式)

    怎么把快手变成夜间模式(怎么把快手变成大屏模式)

  • VIVOY66怎么连接热点共享网络(vivoy66怎么连接电脑)

    VIVOY66怎么连接热点共享网络(vivoy66怎么连接电脑)

  • 抖音字幕不能用哪些字(抖音字幕不能用哪些字中医养生)

    抖音字幕不能用哪些字(抖音字幕不能用哪些字中医养生)

  • 怎么用手机识别花草(怎么用手机识别颜色)

    怎么用手机识别花草(怎么用手机识别颜色)

  • 无边框手机有哪几款(全球首款无边框手机)

    无边框手机有哪几款(全球首款无边框手机)

  • 手机刚换完屏幕有点闪(手机刚换完屏幕,屏幕胶需要多久才能干?)

    手机刚换完屏幕有点闪(手机刚换完屏幕,屏幕胶需要多久才能干?)

  • 微信零钱通明细怎么单独删除(微信零钱通明细和零钱明细在一起吗)

    微信零钱通明细怎么单独删除(微信零钱通明细和零钱明细在一起吗)

  • 微信限额什么时候可以恢复使用(微信限额什么时候解除)

    微信限额什么时候可以恢复使用(微信限额什么时候解除)

  • 文件管理里面的东西删除了可以找回吗(文件管理里面的文件哪些可以删除)

    文件管理里面的东西删除了可以找回吗(文件管理里面的文件哪些可以删除)

  • 小米手环4续航能力(小米手环4续航不足一天)

    小米手环4续航能力(小米手环4续航不足一天)

  • 华为原装电池什么牌子(华为原装电池什么颜色)

    华为原装电池什么牌子(华为原装电池什么颜色)

  • wapi打开耗电吗(wapi打开好还是不打开好)

    wapi打开耗电吗(wapi打开好还是不打开好)

  • 机箱里的风扇有什么用(机箱风扇有异响怎么处理)

    机箱里的风扇有什么用(机箱风扇有异响怎么处理)

  • 图片怎么重命名发送(手机图片怎么重命名)

    图片怎么重命名发送(手机图片怎么重命名)

  • 如何将题目加进目录(如何将题目加进表格中)

    如何将题目加进目录(如何将题目加进表格中)

  • excel怎么自动求乘积(excel怎么自动求和一列数据)

    excel怎么自动求乘积(excel怎么自动求和一列数据)

  • 苹果xr2什么时候上市(iphonexr2什么时候发布)

    苹果xr2什么时候上市(iphonexr2什么时候发布)

  • 小米商城预约有什么用(小米商城预约有优惠券吗)

    小米商城预约有什么用(小米商城预约有优惠券吗)

  • qq删除的好友在哪里可以找到(qq删除的好友在哪里看)

    qq删除的好友在哪里可以找到(qq删除的好友在哪里看)

  • mac钥匙串密码忘记了(macos钥匙串密码忘记)

    mac钥匙串密码忘记了(macos钥匙串密码忘记)

  • ipad上拉菜单没了(ipadmini上拉菜单没有)

    ipad上拉菜单没了(ipadmini上拉菜单没有)

  • excel中yd是什么意思(exceldiv什么意思)

    excel中yd是什么意思(exceldiv什么意思)

  • win11怎么清理Windows.old文件夹? 删除windows.old文件夹的技巧(win11怎么清理电脑垃圾)

    win11怎么清理Windows.old文件夹? 删除windows.old文件夹的技巧(win11怎么清理电脑垃圾)

  • column命令  格式化内容为多列格式(columninfo)

    column命令 格式化内容为多列格式(columninfo)

  • 财务软件使用制度
  • 借款人和还款人不相同的情况下逾期还款会影响哪方信用
  • 劳务报酬需要补税吗
  • 个税计提和发放分录
  • 城市生活垃圾费是业主出还是物业出
  • 服务类公司没有营业执照
  • 企业所得税25%怎么这么高
  • 公司社保退回会退钱吗
  • 附加税的计提基数怎么算
  • 已认证未抵扣的进项税如何报税
  • 各税种会计分录
  • 不管金税四期上线与否,税务严查一刻也没有放松!
  • 有线电视基本收视维护费免征增值税
  • 模拟评估了是什么意思
  • 外商企业需要交企业所得税吗
  • 一般企业的会计原始凭证有哪些类型
  • 企业未代扣代缴个税
  • 政府补贴物业公司
  • 免租金期间交增值税吗
  • 网卡运行异常
  • 研发费中废料收入怎么处理
  • 东方蝾螈怎么养吃什么
  • 实例简介php的一般过程
  • 合作社实际没有法人代表
  • 汇票到期收到款项会计分录
  • 增值税发票开红字发票后账务处理
  • 原材料赔偿会计分录
  • 贷款损失准备的会计核算
  • 劳务派遣公司的账务处理
  • 有关增值税的计算真题
  • Honeybee flying over crocuses in the Tatra Mountains, Poland (© Mirek Kijewski/Getty Images)
  • 全资子公司取得注册证可以免临床
  • php浮点数四舍五入
  • php同时使用session和cookie来保存用户登录信息的实现代码
  • 可视化思考
  • canvas画线条
  • 往来款项清查账务处理
  • 建筑业先预缴还是先扣税
  • 转让土地使用权会计分录
  • 销售使用过的车辆应该如何交增值税
  • 无偿受赠房屋 交个人所得税嘛
  • 收到的存款利息
  • 如何算基数
  • 生产企业生产车间人员密度是多少
  • 代扣员工伙食费
  • 会计科目是怎么来的
  • sql语句批量更新
  • 小公司财务做内账流程
  • 劳务公司的成本有哪些
  • 营改增企业是什么意思
  • 增值税起征点有多少
  • 成品油经销企业资质
  • 损益类账户属于资产还是负债
  • 计提社保个人部分会计分录
  • 专用发票与普通发票图片
  • 会计学主要是学什么
  • sqlserver附加数据库时出错,请单击消息中的超链接
  • win7的运行命令在哪里
  • Win10 Mobile Build 10549正式推送:须回滚到WP8.1升级
  • issch.exe
  • win10 rs5
  • bhvc.exe
  • 桌面任务栏消失怎么办
  • 误删了一些文件电脑不能正常启动了
  • node.js配置
  • python怎么输出日志
  • Python中模块和包的区别
  • 安卓模拟器错误怎么办
  • c++ 编程
  • 3ds 俄罗斯方块
  • dom基础知识
  • js实现框选
  • bootstrap layer弹框
  • js命名函数
  • Material Design:利用RecyclerView CardView实现新闻卡片样式
  • 政府补贴 收入
  • 自用的房产怎么交房产土地税
  • 广西小学成绩查询入口官网
  • 宜昌市西陵区国税局局长
  • 应缴增值税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设