如何在VueJS中重新挂载组件?

问题描述 投票:0回答:2

我有一个作为 DOM 渲染的一部分安装的组件。该应用程序的骨架是

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>title</title>
  </head>
  <body>
    <div id="app">
      <my-component></my-component>
      <button>press this button to reload the component</button>
    </div>
  </body>
</html>

<my-component>
具有功能(它显示一些表单输入)并且
$emit
向父级提供数据。

有办法重新安装它吗?目标是拥有组件内容和设置,就好像它刚刚第一次渲染一样(包括重置保持其状态的

data()
元素)。

对此有一些解决方案,但它们都假设重写

data()
,我想避免这种情况。

我的理解是,组件实际上是在渲染过程中在正确位置注入 dom 中的 HTML/CSS/JS 代码,所以我担心“重新安装”它的概念不存在 - 我只是想在之前确定一下采用 data() 重写方式。

vue.js vuejs2 vue-component vuejs3
2个回答
91
投票

诀窍是改变密钥

当 key 发生变化时,vue 会将其视为新组件,因此会卸载“旧”组件,并挂载“新”组件。

参见示例,

created()
挂钩只会运行一次,因此如果您看到值发生变化,您就会看到一个全新的对象。

示例:

Vue.component('my-component', {
  template: `<div>{{ rand }}</div>`,
  data() {
    return {
      remount: true
    }
  },
  created() {
    this.remount = !this.remount; // true▶false▶true▶false...
  }
});

new Vue({
  el: '#app',
  data: {
    componentKey:0
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.8/vue.min.js"></script>

<div id="app">
  <my-component :key="componentKey"></my-component>
  <button @click="componentKey=!componentKey">press this button to reload the component</button>
</div>


15
投票

在模板中,您将添加

v-if
指令:

<template>
  <my-component v-if="renderComponent" />
</template>

在您的脚本中,您将添加使用

nextTick
:

的方法
<script>
  export default {
    data() {
      return {
        renderComponent: true,
      };
    },
    methods: {
      forceRerender() {
        // Remove my-component from the DOM
        this.renderComponent = false;

        this.$nextTick(() => {
          // Add the component back in
          this.renderComponent = true;
        });
      }
    }
  };
</script>

这就是这里发生的事情:

  1. 最初
    renderComponent
    设置为
    true
    ,因此渲染
    my-component
  2. 当我们调用
    forceRerender
    时,我们立即将
    renderComponent
    设置为
    false
  3. 我们停止渲染
    my-component
    ,因为
    v-if
    指令现在计算为
    false
  4. 在下一个刻度上
    renderComponent
    设置回
    true
  5. 现在
    v-if
    指令的计算结果为
    true
    ,因此我们再次开始渲染
    my-component
© www.soinside.com 2019 - 2024. All rights reserved.