vue2中使用template包裹了两个el-button,并且template添加了判断条件,但是当showSteps值变化为3时,其中设置了disabled的‘生成’按钮禁用属性失效,仍然可以点击,elementui版本:2.15.14;webpack版本:3.12.0,vue版本:2.7.16 代码如下
<template>
<div>
<el-input-number v-model="showSteps"></el-input-number>
<el-button size="small" :disabled="!canSave">关闭</el-button>
<template v-if="![3, 4, 6].includes(showSteps)">
<el-button v-if="showEdit" size="small">edit</el-button>
</template>
<template v-if="showSteps === 3">
<el-button type="success" size="small">赋值</el-button>
<el-button type="primary" size="small" :disabled="!canSave">生成</el-button>
</template>
<template v-else>
<el-button v-if="false" type="primary" size="small" :disabled="!canSave">next</el-button>
</template>
</div>
</template>
<script>
export default {
data() {
return {
canSave: false,
showSteps: 1,
dataStep: 4,
}
},
computed: {
showEdit() {
return this.showSteps <= this.dataStep && this.editStep !== this.showSteps
}
},
}
</script>
目前已知将template标签更换为span、或者为'生成'按钮添加key可以解决这个问题,求助各位是什么样原因导致了这个问题
使用template标签包裹的话,必须严格的v-if + v-else-if + v-else判断就不会出问题
为什么用 v-if 判断会失效?
每个模块会单独挂载/销毁每一块 DOM,造成:
为什么用 v-else-if 就没问题?
因为 v-if + v-else-if + v-else 是一个连续块,Vue 会把它们当作一个整体处理,不会销毁和重建 DOM,而是根据条件“启用或禁用当前分支”。 这样状态就不会中间被“抛失”,所有绑定(比如 :disabled)也会正确应用。这样就能保证:
那为什么将template换成span也是可以的?
原因是:<template> 本身不渲染成实际 DOM 元素
span又是好的,原因:
当然加key的原因这个就不用说了,显式根据key重新渲染保证渲染一致性。