JSX中如何根据条件动态添加可选filter过滤逻辑
JSX中基于条件添加可选数组过滤器的正确实现
你原有代码存在两个核心问题:
- 直接在数组方法调用链中间插入三元表达式,不符合JavaScript语法规则,会直接抛出语法错误
String.prototype.includes()仅支持传入1个待匹配字符串参数,你写的.includes('BACKPACK','LUNCH')实际只会匹配BACKPACK,LUNCH参数会被完全忽略,达不到预期过滤效果
针对你需要按教师权限追加过滤规则的需求,有两种可读性最好的实现方式:
写法1:将条件判断整合到过滤逻辑中(最简洁)
不需要打断方法调用链,在对应filter内部做权限判断,无权限时直接返回true保留所有条目即可:
<Menu> {itemGroupLevels.map(group => this.props.itemTypes .filter(x => x.group_level === group) .filter(x => x.article_type_code !== "GRAL") .filter(x => { // 非教师角色直接跳过这层过滤 if (!Permission.TEACHER) return true; // 教师角色排除包含指定类型编码的条目 return !x.article_type_code.includes('BACKPACK') && !x.article_type_code.includes('LUNCH'); }) .map(value => ( // 此处替换为你原有的菜单项渲染逻辑 <Menu.Item key={value.id}>{value.article_name}</Menu.Item> )) )} </Menu>
写法2:拆分过滤步骤(适合复杂规则场景)
如果后续还要追加更多权限相关的过滤规则,建议拆分步骤先拿到基础过滤结果,再按条件追加过滤,代码可维护性更高:
<Menu> {itemGroupLevels.map(group => { // 先执行所有角色通用的过滤逻辑 const baseItems = this.props.itemTypes .filter(x => x.group_level === group) .filter(x => x.article_type_code !== "GRAL"); // 按教师权限追加专属过滤 const renderItems = Permission.TEACHER ? baseItems.filter(x => !x.article_type_code.includes('BACKPACK') && !x.article_type_code.includes('LUNCH') ) : baseItems; return renderItems.map(value => ( <Menu.Item key={value.id}>{value.article_name}</Menu.Item> )) })} </Menu>
不推荐为了省代码把三元判断直接写在链式调用的filter参数里,规则复杂后可读性会快速下降,后续维护成本更高。
内容的提问来源于stack exchange,提问作者JarochoEngineer
相关产品推荐
相关产品推荐

