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

3 回复

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的响应式系统无法正确追踪数据变化。

问题分析:

  1. 在H5环境下,Vue的响应式系统能正常工作,但在小程序中由于不同的渲染机制,使用函数处理模板数据会干扰数据绑定的响应式检测
  2. 当在v-for循环中调用renderText(item.text)时,小程序平台可能重新计算了整个列表项的渲染上下文,导致v-model绑定失效

解决方案:

  1. 使用计算属性替代方法调用
computed: {
  processedList() {
    return this.list.map(item => ({
      ...item,
      renderedText: item.text || ''
    }))
  }
}

模板中改为:{{ item.renderedText }}

  1. 直接在模板中处理
{{ item.text || '' }}
  1. 使用过滤器(如支持)
filters: {
  renderText(text) {
    return text || ''
  }
}
回到顶部