应使用 computed 而非 filters 实现年龄段判断,因 uni-app 基于 Vue 3,filters 已废弃且不支持响应式依赖追踪;computed 可自动响应 age 变化,并支持封装边界数组与区间逻辑。

直接用计算属性或方法比过滤器更合适。uni-app 的过滤器(filters)在 Vue 3 + Composition API 项目中已被废弃,且不支持响应式依赖追踪——传入的 age 变化时,过滤器不会自动重执行。
为什么不能用 filters 做年龄段判断
uni-app 默认使用 Vue 3(尤其 CLI 创建的 Vite 项目),filters 仅在 Vue 2 模式下有效;即使降级到 Vue 2,过滤器接收的是静态值,无法监听 ref 或 reactive 的变化,也不能调用 computed 或访问 setup 上下文。常见错误是模板里写 {{ age | getAgeGroup }},结果 age 更新后界面不刷新。
推荐用 computed 实现年龄段映射
把年龄段逻辑封装进 computed,既响应数据变化,又便于复用和测试:
- 定义年龄边界数组,比如
[0, 18, 35, 60, 120],对应「未成年」「青年」「中年」「老年」 - 用
findIndex定位区间:boundaries.findIndex((b, i) => age >= b && age - 返回前需校验
age是否为有效数字,避免NaN或负数导致越界
const age = ref(25)
const ageGroup = computed(() => {
if (!Number.isInteger(age.value) || age.value < 0) return '未知'
const boundaries = [0, 18, 35, 60]
const labels = ['未成年', '青年', '中年', '老年']
const idx = boundaries.findIndex((b, i) => age.value >= b && age.value < (boundaries[i + 1] ?? Infinity))
return labels[idx] ?? '未知'
})
如果必须用函数(比如在 v-for 里多次调用)
声明一个普通函数,而非过滤器。它可接收参数、做校验、返回字符串,且无响应性限制:
- 放在
setup()内或独立工具文件里,避免污染全局 - 注意别在函数里直接读取
ref而不加.value,否则会传入引用对象 - 模板中调用:
{{ getAgeGroup(person.age) }},不是{{ person.age | getAgeGroup }}
const getAgeGroup = (age) => {
if (typeof age !== 'number' || age < 0 || !isFinite(age)) return '未知'
if (age < 18) return '未成年'
if (age < 35) return '青年'
if (age < 60) return '中年'
return '老年'
}
最易被忽略的是:年龄段划分标准因业务而异(比如「青年」可能是 15–44 岁),硬编码在模板或函数里会导致维护困难。建议把边界配置抽成常量或从接口获取,而不是散落在多处 if 判断中。


















