javascript - 强制 Vue 重新渲染具有已移除属性的元素
问题描述
在我的 Vue 项目中,我使用了一个第三方库,它没有设置为与 Vue 很好地集成,因为它执行手动 DOM 操作,例如通过删除将有条件禁用的元素的“禁用”属性。每当这个库执行这些操作时,我希望 Vue 刷新它的状态。乍一看,该$forceUpdate
方法似乎很完美,但它似乎并没有像我预期的那样工作......这是一个演示内容的 Codepen,在调用之后removeAttribute
我需要一些方法让 Vue 开始应用有条件的“禁用”标签再次。
编码:
const vm = new Vue({
el: "#app",
data: {
buttonDisabled: true,
}
});
document.getElementById('button').removeAttribute('disabled');
vm.$forceUpdate(); // doesn't work
和
<div id="app">
<button id="button" :disabled="buttonDisabled">
test
</button>
</div>
解决方案
您应该将您的模板视为“纯函数”,这意味着您不应该干扰渲染的输出,否则您会因为这种副作用而得到意想不到的结果。
Vue 跳过重新渲染,因为没有任何变化,因此您需要进行更改以使其正确重新渲染。
在您的具体示例中,您可以通过disabled
使用$nextTick
.
document.getElementById('button').removeAttribute('disabled');
// first change
vm.buttonDisabled = false;
// wait until the update queue is done so Vue can pick up the changes
vm.$nextTick(() => {
// toggle it back on
vm.buttonDisabled = true;
})
推荐阅读
- python - 有没有办法通过空格自动将短语拆分为列表?
- javascript - 可以通过通配符调用 Javascript 函数吗?
- c# - 实体框架,自动将 SystemVersioning 列设置为时态表的未映射
- django - Django celery 注册周期性任务
- python - 如何编码和估算分类数据?
- python - 无法使用 CheckboxGroup 更新散景图
- azure - Azure 中旧式整体 Web 应用的多租户网站托管
- python-3.x - 将 S3 中多个文件夹中的相同文件合并/加载到雪花中
- python - 与打印值相比,返回值奇数
- java - 使用 Thymeleaf 在 Springboot 中反应空白屏幕