在下面选中此demo:
new Vue({
el: '#app',
data: {
flag: true
},
computed: {
style() {
let styleA = {
borderBottom: '1px solid red',
borderRight: '1px solid red'
};
let styleB = {
border: '1px solid green',
borderRight: '1px solid red'
}
return this.flag ? styleA : styleB
}
},
methods: {
changeStyle() {
this.flag = !this.flag;
}
}
})
.box {
width: 100px;
height: 100px;
}
<html>
<header>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</header>
<body>
<div id="app">
<div class="box" :style="style"></div>
<button @click="changeStyle">changeStyle</button>
</div>
</body>
</html>
在此演示中,单击changeStyle
按钮以切换两种不同的样式。
这是步骤:
styleA
和red borderBottom
应用于red borderRight
单击changeStyle
按钮,应用styleB
,期望green border
和red borderRight
,但仅显示green border
。
再次单击changeStyle
按钮,如我们所见,仅显示red borderBottom
,就像red borderRight
消失一样。
再次单击,您将永远不会看到red borderRight
比较虚拟节点和在VUE
中进行渲染是否有问题?
答案 0 :(得分:4)
我真的不知道为什么会这样。
正如您所说,虚拟DOM可能有问题。
根据我的经验,当Vue中的DOM呈现出问题时,使用ThreadPoolExecutor
就可以解决问题。就您而言,确实如此。 https://jsfiddle.net/jacobgoh101/Ld5e8azs/
只需将key
以动态样式添加到div
key
<div class="box" :style="style" :key="style"></div>
只需是可以区分两种样式的任何唯一值
答案 1 :(得分:3)
这是一个错误,但是此问题被认为是wontfix。这是因为border
是速记属性。
编辑:Jacob击败了我几秒钟,但是的,正如gh问题所述,解决方法是使用key
作为哈希来强制渲染。
答案 2 :(得分:1)
另一种但更难看的“ hack”是区分borderRight
样式,因此borderRight: '1px solid red'
中的styleA
和{{注意末尾的空白) {1}}。
这使vue“认为” borderRight: '1px solid red '
已更改,并“强制”它应用样式(并“跳过”优化步骤,跳过了vue认为已经应用的样式)。