uni-app v-for 里面套 v-if 后目前测试符号未渲染

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app v-for 里面套 v-if 后目前测试符号未渲染

开发环境 版本号 项目创建方式
Windows 版本无影响 CLI
3.5.5
3.0.0-alpha-4020620240822002

操作步骤:

const patt = /[,,;;]/g;  
const test = ref(';1k2,'.split(''));  

<view v-for="item in test" :key="item">
    <view v-if="patt.test(item)">
        {{ item }}
    </view>
    <view v-else>
        {{ item }}
    </view>
</view>

2 回复

你好,当你使用 .test() 方法时,它是“状态保持的”,即每次调用都会从上次匹配结束的位置继续开始。
由于 patt.test(str) 被连续调用,因此第二次及后续调用时,正则表达式可能不会从字符串的开始进行匹配,导致不符合预期的结果。
具体的内容可以查看mdn文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test#当设置全局标志的正则使用test


uni-app 中使用 v-forv-if 进行列表渲染和条件判断时,如果遇到符号未渲染的问题,通常是因为 v-ifv-for 的使用顺序或者作用域问题。在 Vue.js(包括 uni-app)中,推荐将 v-if 放置在 v-for 外部,或者通过计算属性先对数据进行处理,以避免性能问题和作用域混淆。

以下是一个示例,展示了如何在 uni-app 中正确使用 v-forv-if,并确保符号正确渲染:

示例场景

假设我们有一个列表数据,每个项都有一个 status 属性,我们只想渲染 statusactive 的项,并且每个项中包含一个符号(如勾号表示激活状态)。

数据结构

data() {
    return {
        items: [
            { id: 1, name: 'Item 1', status: 'active' },
            { id: 2, name: 'Item 2', status: 'inactive' },
            { id: 3, name: 'Item 3', status: 'active' }
        ]
    };
}

模板代码

方法一:在 v-for 外部使用 v-if(不推荐,但可用于简单场景)

<view>
    <view v-for="item in items" :key="item.id">
        <view v-if="item.status === 'active'">
            {{ item.name }} - ✔
        </view>
    </view>
</view>

这种方法在列表项较少时可行,但性能不佳,因为 v-for 会先渲染所有项,然后 v-if 再进行过滤。

方法二:使用计算属性预处理数据

computed: {
    activeItems() {
        return this.items.filter(item => item.status === 'active');
    }
}
<view>
    <view v-for="item in activeItems" :key="item.id">
        {{ item.name }} - ✔
    </view>
</view>

这种方法更推荐,因为它先通过计算属性过滤数据,然后再进行渲染,提高了性能和代码的可读性。

结论

确保符号正确渲染的关键在于正确地使用 v-forv-if,以及合理地处理数据。通过计算属性预处理数据是一种高效且清晰的方式,可以避免直接在模板中混用 v-forv-if 带来的性能问题和作用域混淆。上述代码示例展示了如何在 uni-app 中实现这一点。

回到顶部