uni-app Vue3 App端 改变:style绑定对象的属性值不会重新渲染元素样式
uni-app Vue3 App端 改变:style绑定对象的属性值不会重新渲染元素样式
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows 10 专业版 | 4.75 | HBuilderX |
示例代码:
<template>
<view>
<view :style="viewStyle">{{viewStyle.backgroundColor}}</view>
<button @click="handleChangeColor">改变颜色</button>
</view>
</template>
<script>
export default {
data() {
return {
viewStyle: {backgroundColor: '#0f0'}
}
},
methods: {
handleChangeColor() {
this.viewStyle.backgroundColor = '#00f'
}
}
}
</script>
操作步骤:
把上述代码放到一个page中,选Vue3,在Android App基座中运行
预期结果:
view中文字和它的背景颜色都改变
实际结果:
view中的文字改变了,但它的背景颜色没变
bug描述:
修改:style绑定对象的属性值,那个值确实改变了,把它放到{{}}中能看到变化,但是元素的样式没跟着重新渲染(如果整个替换:style绑定的对象,可以让样式重新渲染)。 这个问题只出现在Vue3 App端。换成Vue2就没问题,换成web端也没问题。更改:class绑定的对象的属性也没有问题。
更多关于uni-app Vue3 App端 改变:style绑定对象的属性值不会重新渲染元素样式的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可以尝试把viewStyle放到computed去触发,这样可以渲染出来的。
更多关于uni-app Vue3 App端 改变:style绑定对象的属性值不会重新渲染元素样式的实战教程也可以访问 https://www.itying.com/category-93-b0.html
放到computed里相当于整个替换对象,这样确实可以渲染出来,只是替换对象中的属性渲染不出来。 这与Web端或Vue2的行为不一致,没有实现Vue文档中的功能,所以应该是一个bug。
这是一个Vue3响应式系统在uni-app App端的兼容性问题。在Vue3中,使用reactive()创建的对象在直接修改其属性时,虽然数据确实变化了,但有时无法正确触发DOM更新。
解决方案:
- 重新赋值整个对象(推荐):
handleChangeColor() {
this.viewStyle = {
...this.viewStyle,
backgroundColor: '#00f'
}
}
- 使用Vue3的响应式方法:
import { reactive } from 'vue'
export default {
setup() {
const viewStyle = reactive({backgroundColor: '#0f0'})
const handleChangeColor = () => {
viewStyle.backgroundColor = '#00f'
}
return {
viewStyle,
handleChangeColor
}
}
}
- 使用ref包装对象:
data() {
return {
viewStyle: ref({backgroundColor: '#0f0'})
}
},
methods: {
handleChangeColor() {
this.viewStyle.value.backgroundColor = '#00f'
}
}

