vue 重新渲染组件,vue强制重新渲染数据

  vue 重新渲染组件,vue强制重新渲染数据

  本文主要介绍vue中强制组件重渲染的正确方法,帮助你更好的理解和使用Vue框架。感兴趣的朋友可以了解一下。

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

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

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

  当然,您可能对其他方式更感兴趣:

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

  方式不当:用v-if。

  更好的方法:使用Vue内置的forceUpdate方法。

  最好的方法:对组件进行关键的更改。

  

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

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

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

  

不妥的方式:使用v-if

  V-if指令,仅在组件为真时呈现。如果为false,则组件在DOM中不存在。

  让我们看看v-if是如何工作的。在模板中,添加v-if指令:

  模板

  my-component v-if= render component /

  /模板

  在脚本中,使用nextTick的方法。

  脚本

  导出默认值{

  data() {

  返回{

  renderComponent: true,

  };

  },

  方法:{

  force render(){

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

  this.renderComponent=false

  这个。$nextTick(()={

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

  this.renderComponent=true

  });

  }

  }

  };

  /脚本

  以上过程大致如下:

  首先,renderComponent设置为true,因此呈现my-component组件。

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

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

  在nextTick方法中将renderComponent设置回true。

  当v-if指令的评估结果为真时,再次渲染my-component。

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

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

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

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

  此外,nextTick可以与promise一起使用:

  force render(){

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

  this.renderComponent=false

  这个。$nextTick()。然后(()={

  this.renderComponent=true

  });

  }

  但是,这并不是一个好的解决办法,还是按照Vue希望我们做的去做吧。

  

较好的方法:forceUpdate 方法

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

  通常,Vue通过更新视图来响应依赖关系的变化。然而,当我们调用forceUpdate时,也有可能强制更新,即使所有的依赖项实际上并没有改变。

  以下是大多数人在使用这种方法时会犯的最大错误。

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

  原因是有时候Vue的响应系统会很混乱。我们以为Vue会对某个属性或变量的变化做出反应,其实不是。在某些情况下,Vue的响应系统根本无法检测到任何变化。

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

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

  //全局

  从“Vue”导入Vue;

  vue . force update();

  //使用组件实例

  导出默认值{

  方法:{

  methodThatForcesUpdate() {

  //.

  这个。$ force update();

  //.

  }

  }

  }

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

  

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

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

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

  正是我们需要的!

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

  

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

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

  假设我们想要呈现具有以下一个或多个组件的列表:

  有一个地方政府

  某种初始化过程,通常在一个已创建或已挂载的钩子中

  通过jQuery或公共api的无响应DOM操作

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

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

  const people=[

  {姓名:埃文,年龄:34 },

  {姓名:莎拉,年龄:98 },

  {姓名:詹姆斯,年龄:45 },

  ];

  如果我们用索引来渲染它,我们会得到以下结果:

  保险商实验所

  李v-for=(person,index) in people :key=index

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

  /李

  /ul

  //输出

  埃文- 0

  莎拉- 1号

  詹姆斯- 2

  如果删除Sarah,您会得到:

  埃文- 0

  詹姆斯一号

  与詹姆斯相关联的索引被改变,即使詹姆斯仍然是詹姆斯。詹姆斯将被重新渲染,这不是我们想要的。

  所以在这里,我们可以使用唯一的id作为密钥。

  const people=[

  { id:这是一个id ,姓名:埃文,年龄:34 },

  { id:唯一id ,姓名:莎拉,年龄:98 },

  { id:另一个唯一id ,姓名:詹姆斯,年龄:45 },

  ];

  保险商实验所

  Li v-for= person in people :key= person . id

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

  /李

  /ul

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

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

  那么接下来让我们来看看,是否使用了最好的方法来重新渲染组件。

  

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

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

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

  这是一个很基本的方法。

  模板

  要重新呈现的组件:key=componentKey /

  /模板

  导出默认值{

  data() {

  返回{

  componentKey: 0

  };

  },

  方法:{

  force render(){

  this . component key=1;

  }

  }

  }

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

  如果真的需要重新渲染某个东西,就选择调变法,而不是其他方法。

  以上是vue中强制组件重渲染的正确方法细节。更多关于Vue中强制组件渲染的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: