你能强制 Vue.js 重新加载/重新渲染吗?

IT技术 javascript vue.js frontend reload rerender
2021-02-09 11:59:53

只是一个简单的问题。

您可以强制Vue.js重新加载/重新计算的一切吗?如果是这样,如何?

6个回答

试试这个魔法咒语:

vm.$forceUpdate();

无需创建任何悬挂变量 :)

更新:当我刚开始使用 VueJS 时,我发现了这个解决方案。然而,进一步的探索证明这种方法是一个拐杖。据我回忆,有一段时间我摆脱了它,只是将所有未能自动刷新的属性(主要是嵌套的)放入计算属性中。

更多信息在这里:https : //vuejs.org/v2/guide/computed.html

这对于在长时间的 axios 调用后更新 a 非常有用。
2021-03-18 11:59:53
当我将它与 Vue 中的表单向导组件一起使用时,这真的帮助了我。尽管数据变量完好无损,但我的表单字段正在丢失状态。现在我使用它来在我回去时刷新视图,我不得不将它放在 setTimeout 函数中。
2021-03-29 11:59:53
请注意,在 vue 文件中,您需要 'this.$forceUpdate();'
2021-03-29 11:59:53
@AbanaClara $forceUpdate() 从来都不是公共方法,我发现它在挖掘 Vue 的源代码。而且由于它的用法从来都不是 Vue'ing 的正确方式,也许它可以被删除。不能确定它是否仍然存在,因为我不再做前端了。
2021-04-05 11:59:53
以某种绝对奇怪的方式$forceUpdate()在 2.5.17 上从来没有为我工作过。
2021-04-11 11:59:53

这似乎是matthiasg这个问题上的一个非常干净的解决方案

:key="someVariableUnderYourControl"当您想要完全重建组件时,您也可以使用和更改密钥

对于我的用例,我将一个 Vuex getter 作为props提供给组件。Vuex 会以某种方式获取数据,但react性无法可靠地重新渲染组件。就我而言,将组件设置为keyprop 上的某个属性可以保证在 getter(和属性)最终解析时刷新。

这是正确的答案,特别是对于 vuex 状态和 vue 路由器。
2021-04-01 11:59:53
这很有帮助。我使用路由完整路径作为键来在路由改变时重新渲染相同的组件。:key="$route.fullPath"
2021-04-03 11:59:53
这是一个巧妙的小技巧,它基本上强制重新实例化组件(mounted将运行等)
2021-04-07 11:59:53
@btk 我同意,这可能不是“正确”的做事方式,但它是一个相当干净的黑客,它是什么。
2021-04-08 11:59:53

请阅读此 http://michaelnthiessen.com/force-re-render/

可怕的方法:重新加载整个页面
可怕的方法:使用 v-if hack
更好的方法:使用 Vue 的内置 forceUpdate 方法
最好的方法:更改组件上的键

<template>
   <component-to-re-render :key="componentKey" />
</template>

<script>
 export default {
  data() {
    return {
      componentKey: 0,
    };
  },
  methods: {
    forceRerender() {
      this.componentKey += 1;  
    }
  }
 }
</script>

我也使用 watch: 在某些情况下。

2021-03-16 11:59:53
该链接实际上并未显示如何以可怕的方式进行操作,不幸的是,这正是我所需要的,因为我的应用程序是围绕可怕的方式进行导航而设计的。当前页面的简单 URL 似乎不起作用,至少在我正在处理的应用程序中不起作用,因此我实际上需要有关如何以可怕的方式进行操作的说明。
2021-03-20 11:59:53
对我来说,Michael Thiessen 的建议是最好的。
2021-03-25 11:59:53

为什么?

...你需要强制更新吗?

也许你没有尽最大努力探索 Vue:

要让 Vue自动对值变化做出react,对象必须最初在data. 或者,如果没有,则必须使用Vue.set().

请参阅下面演示中的评论。或者此处JSFiddle 中打开相同的演示

new Vue({
  el: '#app',
  data: {
    person: {
      name: 'Edson'
    }
  },
  methods: {
    changeName() {
      // because name is declared in data, whenever it
      // changes, Vue automatically updates
      this.person.name = 'Arantes';
    },
    changeNickname() {
      // because nickname is NOT declared in data, when it
      // changes, Vue will NOT automatically update
      this.person.nickname = 'Pele';
      // although if anything else updates, this change will be seen
    },
    changeNicknameProperly() {
      // when some property is NOT INITIALLY declared in data, the correct way
      // to add it is using Vue.set or this.$set
      Vue.set(this.person, 'address', '123th avenue.');
      
      // subsequent changes can be done directly now and it will auto update
      this.person.address = '345th avenue.';
    }
  }
})
/* CSS just for the demo, it is not necessary at all! */
span:nth-of-type(1),button:nth-of-type(1) { color: blue; }
span:nth-of-type(2),button:nth-of-type(2) { color: red; }
span:nth-of-type(3),button:nth-of-type(3) { color: green; }
span { font-family: monospace }
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <span>person.name: {{ person.name }}</span><br>
  <span>person.nickname: {{ person.nickname }}</span><br>
  <span>person.address: {{ person.address }}</span><br>
  <br>
  <button @click="changeName">this.person.name = 'Arantes'; (will auto update because `name` was in `data`)</button><br>
  <button @click="changeNickname">this.person.nickname = 'Pele'; (will NOT auto update because `nickname` was not in `data`)</button><br>
  <button @click="changeNicknameProperly">Vue.set(this.person, 'address', '99th st.'); (WILL auto update even though `address` was not in `data`)</button>
  <br>
  <br>
  For more info, read the comments in the code. Or check the docs on <b>Reactivity</b> (link below).
</div>

要掌握 Vue 的这一部分,请查看Reactivity官方文档- 变更检测注意事项这是必读的!

@the_dude_abides 和@Auroprata,我同意这些是令人耳目一新的合法用途。我提出的问题是,人们并非很少因为错误的原因而进行刷新。
2021-03-22 11:59:53
绝对同意您应该质疑这一刷新要求,但有时您只需要重新渲染 UI,因为视口已更改并且您需要显示不同的资产(作为一个示例)。数据实际上可能没有改变。
2021-03-30 11:59:53
为什么需要重新加载?在某些情况下,浏览器缓存的资源文件(样式表/js)需要在一段时间后重新加载。我有一个样式表,需要在 7 天后重新加载,如果用户通过页面访问保持打开一个选项卡,并在 7 天后返回导航该页面,则 css 已超过 7 天。
2021-04-01 11:59:53
@AchielVolckaert 您可能已经找到了答案,但是是的,它Vue.set()也适用于组件内部。
2021-04-10 11:59:53
也许你只是想修复一个设计糟糕的 web 应用程序中的错误,该应用程序纯粹将 vue 用作渲染工具,例如,每当它进入服务器时都会重新加载整个应用程序,而忽略了 vue 的客户端应用程序功能。在现实世界中,您并不总是有时间修复您发现的每一个可憎之处。
2021-04-11 11:59:53

尝试使用this.$router.go(0);手动重新加载当前页面。

更简单: this.$router.go()
2021-03-24 11:59:53
实际上@MariusAndreiana - .go() 函数需要 1 个非可选参数
2021-03-31 11:59:53