【问题标题】:How to load again(reload) component in VueJs or destroy it and load again?如何在 VueJs 中再次加载(重新加载)组件或销毁它并再次加载?
【发布时间】:2020-07-04 02:35:59
【问题描述】:

我在 VueJs 中有一个组件,例如 Player(或任何其他组件),用于播放音频和管理播放列表。

现在,当我更改播放列表而不更改路线时,我需要重新加载它。有没有办法重新加载组件或销毁它然后立即加载它?

我想在this组件播放音乐的时候改变它的播放列表,但有时它会播放上一个播放列表的音乐,我不知道为什么。

HTML 段:

<aplayer autoplay
  ref="remote"
  :music="music_list[0]"
  :list="music_list"
  :float="float"
  :mutex="mutex"
  repeat="list"
  :mini="mini"
  preload="auto"
  @ended="onEnd"
  @loadstart="playCMD"
  @playing="onStart"
  :listFolded="listFolded"
  :controls="controls"
  :muted.sync="muted"
  :volume.sync="volume"
  slot="display"
/>

JavaScript 段:

export default {
  components: {
    Aplayer
  },
  data: () => ({
    float: false,
    autoplay: true,
    mutex: true,
    muted: false,
    volume: 0.8,
    mini: false,
    listFolded: false,
    controls: true,
    music_list: [..]
  }),
  methods: {
    onEnd: function () {
      // Doing a series of jobs that leads to raising an event then
      this.music_list = [new music list after event trigger]
    }
  }
}

【问题讨论】:

  • 为什么需要重新加载组件?如果您正确绑定数据,则不必重新加载整个内容。似乎是性能问题。 Vue 的反应系统应该能够获取您需要的所有更改(如果使用正确),而无需刷新任何内容。我认为this resource 拥有您正在寻找的一切
  • @EvanBechtol 非常感谢。因为我用于项目的组件有一些错误,当我更改路线时它可以正常工作。
  • 没问题,这有时是 3rd-party 的缺点 ;) 链接资源对您有帮助吗?
  • @EvanBechtol 我想在this 组件播放音乐时更改播放列表,但有时它会播放上一个播放列表的音乐,我不知道为什么。
  • 能否更新您的问题并附上相关代码?

标签: javascript vue.js vue-component vue-router quasar-framework


【解决方案1】:

您的更改没有被采纳的原因是您(或播放器组件)没有正确利用 Vue 的反应系统。您应该使用the appropriate array mutation method,以便维护array reactivityVue 不会拾取直接对数组元素所做的更改

意思是,当你做这样的事情时:

this.myArray[1] = "some new value";

这些更改将不会被 Vue 采用。


Vue中操作数组的正确方法

使用您的onEnd 方法,尝试将代码更改为此......

onEnd: function () {
  // Assumption: resultOfSomeJob is an array of songs for the playlist

  // Clear our playlist
  this.music_list = [];

  // Push elements to our music_list using the Vue array method "push"
  this.music_list.push(...resultOfSomeJob);
}

编辑:

我查看了aplayer 组件代码。我的答案有效的原因是因为它需要您提供的:list,以及computes a new propertymusicList

(这里是代码,以防将来发生变化)

musicList () {
  return this.list
}

我发现 Vue 文档中的 this excerpt 非常有助于理解这里发生了什么...

计算的属性根据它们的反应依赖进行缓存。计算属性仅在其某些反应性依赖项发生更改时才会重新评估。

因此,当您更改数组而不使用适当的方法来保持反应性,然后将其传递给a-player 组件时,计算属性不会更新。因此,您的旧播放列表仍然存在 :)

【讨论】:

  • 你的回答很有用,但我不知道为什么这不起作用。
  • 你的意思是我的回答没有解决问题吗?我认为你这样做的方式不起作用,因为&lt;aplayer&gt; 组件是如何利用数组的。它很可能在 Vue 反应范围之外做一些事情。因此,当您像我在回答中所做的那样重置 music_list 数组时,它会重置该组件中的数据结构
  • 您的回答是对的,我正在寻找Aplayer 中的错误。另外,我使用 from $refs 来检查正在播放的音乐。 $refs 属性是实时的吗?
  • @AliHallaji 我已经用组件中的错误更新了我的答案
  • 感谢您。所以我应该把音乐列表放在我的代码中?
【解决方案2】:

最简单的 hack,只需使用 v-if:

<aplayer v-if='loaded' />

脚本

export default {
  components: { Aplayer },
  data: () => ({
    loaded: true,
  }),
  methods: {
    onEnd: function () {
      // when you want to reload the component just make `loaded = false`
      this.loaded = false;
      // load agin with `setTimeout` or promise 
      // or with your logic - whenever the component is ready to show
      setTimeout(() => {
        this.loaded = true
      }, 500); // delay in ms
    }
  }
}

【讨论】:

  • 简单干净,不错的方法!
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多