强制Vue重新渲染组件的方法

发布时间:2020-06-24 16:09:56

来源:亿速云

阅读:217

作者:元一

这篇文章运用简单易懂的例子给大家介绍强制Vue重新渲染组件的方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

有时候,依赖 Vue 响应方式来更新数据是不够的,相反,我们需要手动重新渲染组件来更新数据。或者,我们可能只想抛开当前的DOM,重新开始。那么,如何让Vue以正确的方式重新呈现组件呢?

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

这是一个非常简单的解决方案。

当然,你可能会对其他方式会更感兴趣:简单粗暴的方式:重新加载整个页面

不妥的方式:使用 v-if

较好的方法:使用Vue的内置forceUpdate方法

最好的方法:在组件上进行 key 更改

简单粗暴的方式:重新加载整个页面

这相当于每次你想关闭应用程序时都要重新启动你的电脑。

这种方式或许有用,但这是一个非常糟糕的解决方案,不要这样做,我们来看看更好的方法。

不妥的方式:使用v-if

v-if指令,该指令仅在组件为true时才渲染。 如果为false,则该组件在DOM中不存在。

来看看,v-if 是怎么工作的,在template中,添加v-if指令:

在script 中,使用nextTick的方法

export default {

data() {

return {

renderComponent: true,

};

},

methods: {

forceRerender() {

// 从 DOM 中删除 my-component 组件

this.renderComponent = false;

this.$nextTick(() => {

// 在 DOM 中添加 my-component 组件

this.renderComponent = true;

});

}

}

};

上面的过程大致如下:刚开始 renderComponent设置为true,因此渲染 my-component 组件

当我们调用forceRerender时,我们立即将renderComponent设置为false

我们停止渲染my-component,因为v-if指令现在计算结果为false

在nextTick方法中将renderComponent设置回true

当v-if指令的计算结果为true时,再次渲染my-component

在这个过程中,有两个部分比较重要

首先,我们必须等到nextTick,否则我们不会看到任何变化。

在Vue中,一个 tick 是一个DOM更新周期。Vue将收集在同一 tick 中进行的所有更新,在 tick 结束时,它将根据这些更新来渲染 DOM 中的内容。如果我们不等到next tick,我们对renderComponent的更新就会自动取消,什么也不会改变。

其次,当我们第二次渲染时,Vue将创建一个全新的组件。 Vue 将销毁第一个,并创建一个新的,这意味着我们的新my-component将像正常情况一样经历其所有生命周期-created,mounted等。

另外,nextTick 可以与 promise 一起使用:forceRerender() {

// 从 DOM 中删除 my-component 组件

this.renderComponent = false;

this.$nextTick().then(() => {

this.renderComponent = true;

});

}

不过,这并不是一个很好的解决方案,所以,让我们做 Vue 想让我们做的

较好的方法:forceUpdate 方法

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

通常情况下,Vue 会通过更新视图来响应依赖项中的更改。然而,当我们调用forceUpdate时,也可以强制执行更新,即使所有依赖项实际上都没有改变。

下面是大多数人使用这种方法时所犯的最大错误。

如果 Vue 在事情发生变化时自动更新,为什么我们需要强制更新呢?

原因是有时候 Vue 的响应系统会让人感到困惑,我们认为Vue会对某个属性或变量的变化做出响应,但实际上并不是这样。在某些情况下,Vue的响应系统根本检测不到任何变化。

所以就像上一个方法,如果你需要这个来重新渲染你的组件,可能有一个更好的方法。

有两种不同的方法可以在组件实例本身和全局调用forceUpdate:// 全局

import Vue from 'vue';

Vue.forceUpdate();

// 使用组件实例

export default {

methods: {

methodThatForcesUpdate() {

// ...

this.$forceUpdate();

// ...

}

}

}

重要提示:这不会更新任何计算属性,调用forceUpdate仅仅强制重新渲染视图。

最好的方法:在组件上进行key 更改

在许多情况下,我们需要重新渲染组件。

要正确地做到这一点,我们将提供一个key属性,以便 Vue 知道特定的组件与特定的数据片段相关联。如果key保持不变,则不会更改组件,但是如果key发生更改,Vue 就会知道应该删除旧组件并创建新组件。

正是我们需要的!

但是首先,我们需要绕一小段路来理解为什么在Vue中使用key。

为什么我们需要在 Vue 中使用 key

一旦你理解了这一点,那么这是了解如何以正确方式强制重新渲染的很小的一步。

假设我们要渲染具有以下一项或多项内容的组件列表:有本地的状态

某种初始化过程,通常在created或mounted钩子中

通过jQuery或普通api进行无响应的DOM操作

如果你对该列表进行排序或以任何其他方式对其进行更新,则需要重新渲染列表的某些部分。 但是,不会希望重新渲染列表中的所有内容,而只是重新渲染已更改的内容。

为了帮助 Vue 跟踪已更改和未更改的内容,我们提供了一个key属性。 在这里使用数组的索引,因为索引没有绑定到列表中的特定对象。const people = [

{ name: 'Evan', age: 34 },

{ name: 'Sarah', age: 98 },

{ name: 'James', age: 45 },

];

如果我们使用索引将其渲染出来,则会得到以下结果:

  • {{ person.name }} - {{ index }}

// Outputs

Evan - 0

Sarah - 1

James - 2

如果删除Sarah,得到:Evan - 0

James - 1

与James关联的索引被更改,即使James仍然是James。 James会被重新渲染,这并不是我们希望的。

所以这里,我们可以使用唯一的 id 来作为 keyconst people = [

{ id: 'this-is-an-id', name: 'Evan', age: 34 },

{ id: 'unique-id', name: 'Sarah', age: 98 },

{ id: 'another-unique-id', name: 'James', age: 45 },

];

  • {{ person.name }} - {{ person.id }}

在我们从列表中删除Sarah之前,Vue删除了Sarah和James的组件,然后为James创建了一个新组件。现在,Vue知道它可以为Evan和James保留这两个组件,它所要做的就是删除Sarah的。

如果我们向列表中添加一个person,Vue 还知道可以保留所有现有的组件,并且只需要创建一个新组件并将其插入正确的位置。这是非常有用的,当我们有更复杂的组件,它们有自己的状态,有初始化逻辑,或者做任何类型的DOM操作时,这对我们很有帮助。

所以接下来看看,如果使用最好的方法来重新渲染组件。

更改 key 以强制重新渲染组件

最后,这是强制Vue重新渲染组件的最佳方法(我认为)。

我们可以采用这种将key分配给子组件的策略,但是每次想重新渲染组件时,只需更新该key即可。

这是一个非常基本的方法

export default {

data() {

return {

componentKey: 0,

};

},

methods: {

forceRerender() {

this.componentKey += 1;

}

}

}

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

如果确实需要重新渲染某些内容,请选择key更改方法而不是其他方法。

扩展知识:

Vue.js是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。

Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件 。

Vue.js 自身不是一个全能框架--它只聚焦于视图层。因此它非常容易学习,非常容易与其它库或已有项目整合。另一方面,在与相关工具和支持库一起使用时 ,Vue.js 也能完美地驱动复杂的单页应用。

关于强制Vue重新渲染组件的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

vue强制刷新组件_强制Vue重新渲染组件的方法相关推荐

  1. vue刷新页面如何保证路由不变_vue 刷新之后 嵌套路由不变 重新渲染页面的方法...

    vue 刷新之后 嵌套路由不变 重新渲染页面的方法 解决嵌套路由刷新时,路由没有变化,正常情况下页面是不会重新渲染的 1.在router-view中加上条件渲染 v-if 默认为true.让它显示出来 ...

  2. vue 父刷新子_父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法...

    场景: 我实际用到的是这样的,我父组件引用子组件related,父组件调用获取页面详情的方法,更新了state值related,子组件根据该related来渲染相关新闻内容,但是页面打开的时候总是先加 ...

  3. vue 添加全局组件_自定义vue全局组件(Loading为例)

    首先创建一个项目 vue init webpack-simple define-demo //define-demo 项目名称 cd define-demo npm install //安装本次所有需 ...

  4. vue 添加全局组件_自定义vue2.0全局组件(下篇)

    在上篇中,老K为大家介绍了一个初级自定义按钮组件的编写方法.虽然能用,但是还不算完美,可扩展性不够强大.在这一篇中,老K继续为大家完善这个按钮组件. 启动命令窗口, 进入在上篇中我们搭建的vue目录中 ...

  5. vue tree组件_使用Vue 3.0做JSX(TSX)风格的组件开发

    前言 我日常工作都是使用React来做开发,但是我对React一直不是很满意,特别是在推出React Hooks以后. 不可否认React Hooks极大地方便了开发者,但是它又有非常多反直觉的地方, ...

  6. vue日期选择组件_一个Vue组件,为波斯开发人员提供日期选择器

    vue日期选择组件 Vue波斯日期选择器 (vue persian datepicker) This is a Jalali date picker component for Vue. 这是Vue的 ...

  7. vue连线 插件_【Vue CLI】手把手教你撸插件

    现如今 Vue 作为主流的前端框架之一,其健全的配套工具,活跃的开源社区,让广发码农热衷追捧.Vue CLI 作为其官方的开发构建工具,目前已更新迭代到 4.x 版本,其内部集成了日常开发用到的打包压 ...

  8. vue为p标签_通过vue.js几个基本操作,理解一下什么是插槽「606」

    更多的文章,请关注我的头条号,我是落笔承冰. 一.先创建一个test1.html文件,还是得在head里链接vue的库. 二.创建一个父组件一个全局子组件. 三.给子组件添加模板吧,然后在父组件里显示 ...

  9. vue.js 构建项目_使用Vue.js和AWS Amplify构建Chatbot

    vue.js 构建项目 Over the last few years, chatbots have exploded in popularity. It makes sense that busin ...

  10. vue单选框选中_使用vue如何默认选中单选框

    使用了vue以后,发现这真的是一个灵活高效的框架,能够轻松实现页面的实时刷新. 那么,今天先聊聊单选框的使用.一般我们使用单选框,会这么写: //HTML one two three 有"c ...

最新文章

  1. 大型软件公司.net面试题!一定得看(附答案)
  2. Nginx log error:client sent invalid userid cookie
  3. 使用OpenCV调用Caffe-SSD训练好的模型
  4. jQuery选择器整理
  5. InnoDB与MyISAM的六大区别(转)
  6. EOJ_1057_排名汇总
  7. ssh连接局域网内ubuntu主机_ubuntu使用ssh连接远程电脑的方法
  8. notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了
  9. 深度学习之基于DCGAN实现动漫人物的生成
  10. python测试udp端口_怎样测试UDP端口
  11. deploy mysql_Deploy Mysql
  12. 1、视觉slam简介
  13. mysql 开启用户远程登录
  14. 计算机网络实验——ns3仿真最短路由选择算法
  15. 受微软信任的交叉证书将在2021年4月到期,代码签名证书将无法签内核驱动,安信教你如何才能再给驱动签名
  16. libtorrent java_libtorrent 编译
  17. Frank计算机基础硬件笔记
  18. Unix/Linux中/usr目录的由来
  19. 微信开发之data:image/png;base64,
  20. pandas读取数据时,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid contin

热门文章

  1. 关于断点续传的那些事
  2. 邮件服务器最常见的安全问题及解决办法
  3. Repeater思路整理
  4. java8新特性—— Lambda来由
  5. JDK-阻塞队列、非阻塞队列原理
  6. 框架之---Flask
  7. CentOS7源码安装Python3
  8. CCNode作为容器实现显示区域剪裁
  9. iOS 更改导航栏返回button文字
  10. 公司网站的访问量突破了每天PV1.5亿