uni-app 渲染列表数据时 使用函数处理渲染列表元素的一个属性 会使元素的其他属性v-model失效
uni-app 渲染列表数据时 使用函数处理渲染列表元素的一个属性 会使元素的其他属性v-model失效
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | 11.4 | HBuilderX |
产品分类:uniapp/小程序/阿里
操作步骤:
- 建一个项目把上面的代码放进去运行
预期结果:
- 点击checkbox会改变颜色
实际结果:
- 没有反应,初始状态也没渲染
bug描述: 渲染一个列表数据时,使用函数处理渲染列表元素的一个属性,会使元素的其他属性v-model失效。 在阿里小程序和微信小程序试了都有这个bug,h5没有。
<template>
<view>
<view
v-for="(item, index) in list"
:key="index"
style="display: flex;margin: 30px;"
>
<my-checkbox v-model="item.switch1"></my-checkbox>
<my-checkbox v-model="item.switch2"></my-checkbox>
<!-- 直接渲染没问题 -->
<!-- {{ item.text }} -->
<!-- 使用函数渲染会使上面两个组件的v-model绑定失效 -->
{{ renderText(item.text) }}
</view>
</view>
</template>
<script>
import MyCheckbox from '../../c/my-checkbox.vue';
export default {
name: 'index',
components: {
MyCheckbox
},
data() {
return {
list: [
{
switch1: false,
switch2: true,
text: 'hello world1'
},
{
switch1: false,
switch2: true,
text: 'hello world2'
}
]
};
},
onLoad() {},
methods: {
renderText(text) {
return text || '';
}
}
};
</script>
<template>
<view
style="width: 30px;height: 30px;border-radius: 20px;"
:style="{
backgroundColor: value ? 'red' : 'gray'
}"
@click="$emit('input', !value)"
></view>
</template>
<script>
export default {
name: 'my-checkbox',
props: {
value: {
type: Boolean,
default: false
}
},
model: {
prop: 'value',
event: 'input'
}
};
</script>
更多关于uni-app 渲染列表数据时 使用函数处理渲染列表元素的一个属性 会使元素的其他属性v-model失效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
scopedSlotsCompiler 尝试切换为 legacy 或者 augmented 试试
https://uniapp.dcloud.io/collocation/manifest?id=mp-weixin
更多关于uni-app 渲染列表数据时 使用函数处理渲染列表元素的一个属性 会使元素的其他属性v-model失效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
不行,看看是不是和这个bug一致没修复:https://ask.dcloud.net.cn/question/111502
这是一个由uni-app框架在小程序平台的数据更新机制引起的问题。在小程序环境中,当模板中使用方法处理数据渲染时,可能会导致Vue的响应式系统无法正确追踪数据变化。
问题分析:
- 在H5环境下,Vue的响应式系统能正常工作,但在小程序中由于不同的渲染机制,使用函数处理模板数据会干扰数据绑定的响应式检测
- 当在
v-for循环中调用renderText(item.text)时,小程序平台可能重新计算了整个列表项的渲染上下文,导致v-model绑定失效
解决方案:
- 使用计算属性替代方法调用
computed: {
processedList() {
return this.list.map(item => ({
...item,
renderedText: item.text || ''
}))
}
}
模板中改为:{{ item.renderedText }}
- 直接在模板中处理
{{ item.text || '' }}
- 使用过滤器(如支持)
filters: {
renderText(text) {
return text || ''
}
}

