vue.js - Vue 范围 slider 手动更改被增量更改事件覆盖?

标签 vue.js vuejs2 vue-component

我在自定义媒体播放器组件中使用 BootstrapVue 范围 slider ,代表媒体的播放位置。 slider 是绑定(bind)到 playbackPosition 的 v-model,它在媒体播放时由事件监听器增量更新,导致 slider handle 可预测地移动。 (该事件由第 3 方库发出。)

当我手动调整范围 slider 时,它设置了 playbackPosition,并且一切正常 - 只要媒体尚未播放。

如果它已经在播放,增量事件会不断更新 playbackPosition,这会迫使我的范围 slider handle 在我有机会释放 handle 之前移动到我不想要的位置。而且,当然,我不能用输入监听器替换更改监听器,因为增量更新被识别为输入,这会导致播放失控。

如何让范围 slider 自行移动以反射(reflect)播放位置,同时允许通过滑动 handle 手动设置位置?

最佳答案

slider 的位置应该完全由您的第三方库控制是否可行?当您拖动 slider 时,告诉库更新其在轨道中的位置但不要手动更新 slider 位置,这将反过来导致库发出一个新的位置事件,然后您的 slider 位置。

但是,如果位置事件没有在位置更改后(相对)立即发出,则 slider 可能会滞后于您要拖动到的位置。在这种情况下,您可以维护一个数据属性,它保存来自您的第 3 方库的位置,以及第二个数据属性,它保存用户将 slider 拖动到的位置,并使用计算属性来控制 slider 的实际位置。像这样:

data() {
  return {
    trackPosition: 0,
    userPosition: null,
  }
},
computed: {
  sliderPosition() {
    return this.userPosition !== null ? this.userPosition : this.trackPosition;
  }
}

现在,当您开始手动移动 slider 时,为 userPosition 设置一个值,sliderPosition 将匹配新位置而不是当前轨道位置。当您完成移动 slider 并可能指示第三方库更改轨道位置时,将 userPosition 设置为 nullsliderPosition 现在将返回匹配第三方图书馆给出的位置。

关于vue.js - Vue 范围 slider 手动更改被增量更改事件覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52565029/

相关文章:

javascript - 如何从 vue.js 方法渲染 d3.js 图表(传递目标 div)?

javascript - Vue.js 试图通过计算中的 ID 获取 DOM 元素返回 null

javascript - 计算属性未在 Vue.js 中返回正确的值

javascript - 如何在 select 中添加条件? (Vue.JS 2)

javascript - 在 Vue 中使用条件问题创建动态表单

vue.js - 在 Vue 组件之间共享常量

typescript - Vue `install` 函数有类型吗?属性 `directive` 应该存在于类型 `Vue` 上吗?

javascript - 实现 vue 表时出现错误 "emitted value instead of an instance of error while compiling template "

javascript - Vue.js 组件调用 data 属性内的方法

vue.js - 如何解决vue中避免冗余导航到当前位置错误?