使用Ramda range生成React组件,如何每3个插入自定义内容?
解决方案:每3个Perk组件后插入自定义内容
嘿,我明白你的需求了——你已经有了能正确渲染18个Perk组件的代码,现在需要每3个组件后插入自定义内容对吧?用Ramda来处理这个其实很顺畅,我给你梳理个清晰的实现方式:
核心思路
先生成完整的18个Perk组件数组(已解锁的CheckCircle + 未解锁的CheckBoxOutline),然后用Ramda的splitEvery(3)把数组切成每3个一组的块,接着给每组(除了最后一组,可选)后面加上你的自定义内容,最后把所有内容扁平化后渲染即可。
完整代码示例
import React from 'react'; import R from 'ramda'; import CheckCircle from '@mui/icons-material/CheckCircle'; import CheckBoxOutlineBlank from '@mui/icons-material/CheckBoxOutlineBlank'; // 修正Material-UI组件名,若你用的是自定义组件可改回原名称 import { uid } from 'uid'; // 假设你用uid库生成唯一key // 自定义内容组件,替换成你需要的样式/结构即可 const CustomPerkDivider = () => ( <div style={{ margin: '8px 0', height: '2px', width: '100%', backgroundColor: '#e0e0e0' }} /> ); class PerkProgressDisplay extends React.Component { render() { const { perkProgress } = this.props; // 1. 生成完整的18个Perk组件数组 const fullPerkList = [ ...R.range(0, perkProgress).map(() => ( <CheckCircle key={`perk-${uid()}`} color="primary" /> )), ...R.range(perkProgress, 18).map(() => ( <CheckBoxOutlineBlank key={`perk-${uid()}`} color="inherit" /> )) ]; // 2. 按每3个组件为一组拆分数组 const groupedPerks = R.splitEvery(3, fullPerkList); // 3. 给每组添加自定义分隔内容(最后一组可选不加) const perksWithDividers = R.flatten( groupedPerks.map((group, groupIndex) => { const elements = [...group]; // 若不需要最后一组后加分隔符,保留这个判断;反之则删除 if (groupIndex !== groupedPerks.length - 1) { elements.push(<CustomPerkDivider key={`divider-${groupIndex}`} />); } return elements; }) ); return <div className="perk-container">{perksWithDividers}</div>; } }
关键细节说明
- Ramda的
splitEvery:这个函数完美适配分组需求,不用手动写循环判断索引,直接按指定长度拆分数组,代码更简洁。 - Key的唯一性:给每个组件(包括自定义分隔符)都生成了唯一key,避免React的key警告——别用数组索引当key,用
uid()生成唯一标识更可靠。 - 最后一组的灵活处理:代码里加了判断,最后一组后面不会加自定义内容;如果希望18个组件后也加分隔符,直接去掉那个
if判断即可。 - 组件名称修正:Material-UI官方的未勾选框组件是
CheckBoxOutlineBlank,你之前写的CheckBoxOutline可能是笔误,若你用的是自定义组件,改回原名称就行。
内容的提问来源于stack exchange,提问作者DNorthrup
相关产品推荐
相关产品推荐

