动态给元素节点绑定 class 问题在uni-app中子元素样式不生效的问题
动态给元素节点绑定 class 问题在uni-app中子元素样式不生效的问题
示例代码:
<template>
<view class="is-today" :class="{ 'is-selected': test() }">
<view class="box" @click="handle()">点击我变黄1</view>
</view>
</template>
<script lang="uts" setup>
import { ref } from "vue";
const active = ref(false);
function handle() {
active.value = true;
}
function test() {
return active.value;
}
</script>
<style>
.is-today {
background: red;
padding: 200rpx;
}
.is-today .box {
height: 500rpx;
background: green;
}
.is-selected {
background: yellow;
}
.is-selected .box {
height: 300rpx;
background: salmon;
}
</style>
操作步骤:
- 直接点击子元素(绿色区域)
预期结果:
- 子元素改变样式
实际结果:
- 子元素新样式没有生效
bug描述:
动态给元素节点绑定 class 问题,子元素样式不生效的问题。 这是BUG还是设计就是这样的呢。
| 项目信息 | 描述 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| 手机系统 | Android |
| 手机系统版本 | Android 12 |
| 手机厂商 | realme |
| 手机机型 | 真我q3s |
| 页面类型 | nvue |
| vue版本 | vue3 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于动态给元素节点绑定 class 问题在uni-app中子元素样式不生效的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你是 uniapp x 吗,我看你用到了 uts。但是 bug 信息里说的是 nvue 和 unapp。
如果是 uniappx,目前是设计如此,父元素的调整不会改变子元素的样式,目前暂不支持 web 中这种写法。你需要明确要改动的具体样式,也就是通知子元素、子组件改变了 class,从而实现子元素样式动态改变。
更多关于动态给元素节点绑定 class 问题在uni-app中子元素样式不生效的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
因为发布问答的地方没有 uniappx 的选项,所以只能选uniapp。 OK,既然是设计如此那就没问题了
这是一个在 uni-app nvue 中的样式渲染机制问题,不是 BUG,而是 nvue 与普通 vue 页面在样式处理上的差异。
在 nvue 中,CSS 的实现基于 Weex 的渲染引擎,对样式的支持与 Web 有所不同。主要问题在于:
-
nvue 中的样式继承限制:nvue 不支持 CSS 的完整继承链,子元素无法通过父元素的类名变化自动继承样式更新。
-
样式作用域隔离:在 nvue 中,
.is-selected .box这样的嵌套选择器在动态类名更新时可能无法正确触发子元素重渲染。
解决方案:
将子元素的样式绑定也改为响应式:
<template>
<view class="is-today" :class="{ 'is-selected': test() }">
<view class="box" :class="{ 'selected-box': test() }" @click="handle()">
点击我变黄1
</view>
</view>
</template>
<style>
.is-today {
background: red;
padding: 200rpx;
}
.is-today .box {
height: 500rpx;
background: green;
}
.is-selected {
background: yellow;
}
.selected-box {
height: 300rpx !important;
background: salmon !important;
}
</style>
或者使用计算属性直接控制子元素的样式:
<template>
<view class="is-today" :class="{ 'is-selected': test() }">
<view class="box" :style="boxStyle" @click="handle()">
点击我变黄1
</view>
</view>
</template>
<script lang="uts" setup>
import { ref, computed } from "vue";
const active = ref(false);
function handle() {
active.value = true;
}
function test() {
return active.value;
}
const boxStyle = computed(() => {
return active.value ? {
height: '300rpx',
backgroundColor: 'salmon'
} : {}
})
</script>

