如何重新加载vue组件?

时间:2017-09-14 05:37:04

标签: vue.js vuejs2 vue-component vuex

我知道解决方案是更新道具数据,如下所示:

this.selectedContinent = ""

但我想使用其他解决方案

在我阅读了一些参考文献后,解决方法是:

this.$forceUpdate()

我尝试了,但它不起作用

这样的演示和完整代码:

https://jsfiddle.net/Lgxrcc5p/13/

您可以点击按钮测试来试试

我需要一个解决方案,而不是更新属性数据

6 个答案:

答案 0 :(得分:3)

我使用v-if渲染组件:

<div id="app">
      <button type="button" @click="updateComponent">test</button>
      <test-el v-if="show"></test-el>
</div>

demo

答案 1 :(得分:1)

您必须为组件分配一个密钥。当您要重新渲染组件时,只需更新密钥即可。 更多信息here

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

export default {
  data() {
    return {
      componentKey: 0
    }
  },
  methods: {
    forceRerender() {
      this.componentKey += 1
    }
  }
}

答案 2 :(得分:1)

最简单的

对于对象中的数据,使用您的密钥作为 JSON.stringify(data)

  <component :key="JSON.stringify(data)" :data="data" />

只需更新您的状态

$vm.data={
name:'balaji'
}

它会自动更新您的组件

答案 3 :(得分:0)

您可以使用Object.assign分配初始数据属性。

而不是this.$forceUpdate()

您应该使用Object.assign(this.$data,this.$options.data.call(this))

这里我们使用这个。$ options.data获取原始数据并将此值分配给此。$ data。

请参阅更新的小提琴Link

<强>更新

另一种方法:Link

答案 4 :(得分:0)

我也面临同样的问题。我使用location.reload()重新加载组件。
这可能不是解决此问题的正确方法。但这解决了我的问题。

答案 5 :(得分:0)

我以为我需要重新加载,但是我能够将挂接的钩子中的所有内容移至init方法。挂接的钩子调用init方法,如果您需要父级重新加载所有内容,则可以使用ref来调用this。$ refs.componentName.init();。