You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React遍历map渲染条目时如何仅展示一个控制所有内容的年份滑块

我们只需要做3处核心修改,就能在保留Slices遍历渲染逻辑的前提下实现需求:


1. 调整全局日期状态结构

原来的状态是按section存储多个年份,现在直接改为存储单个全局年份即可:

const DatesProvider = ({ children }) => {
  // 改为单个年份状态,不用按section区分
  const [currentYear, setCurrentYear] = React.useState(2021);
  return (
    <DateContext.Provider value={{ currentYear, setCurrentYear }}>
      {children}
    </DateContext.Provider>
  );
};

2. 遍历渲染时过滤多余的DatePicker

加一个标记位,只渲染第一个DatePicker,后续的DatePicker全部跳过不渲染,完全保留原有的Slices遍历逻辑:

export default function App() {
  // 标记是否已经渲染过日期选择器
  let hasRenderedPicker = false;
  return (
    <div className="App">
      <DatesProvider>
        {data.map((item, index) => {
          const Slice = slices[item.type];
          // 遇到DatePicker类型,已经渲染过的话直接跳过
          if (item.type === 'DatePicker') {
            if (hasRenderedPicker) return null;
            hasRenderedPicker = true;
          }
          return <Slice section={item.section} key={index} />;
        })}
      </DatesProvider>
    </div>
  );
}

3. 简化DatePicker和Item的逻辑,直接使用全局年份

const DatePicker = () => {
  const { currentYear, setCurrentYear } = React.useContext(DateContext);

  const handlePlus = () => setCurrentYear(prev => prev + 1);
  const handleMinus = () => setCurrentYear(prev => prev - 1);

  return (
    <div style={{ marginTop: 30 }}>
      <button onClick={handleMinus}>-</button>
      <span>{currentYear}</span>
      <button onClick={handlePlus}>+</button>
    </div>
  );
};

const Item = ({ section }) => {
  const { currentYear } = React.useContext(DateContext);
  return (
    <div>
      Section: {section} | Year: {currentYear}
    </div>
  );
};

如果后续需要恢复多滑块独立控制的能力,只需要把状态改回按section存储、移除遍历的过滤逻辑即可,整体兼容成本很低。

内容的提问来源于stack exchange,提问作者RandomDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:15:03