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

React中如何在React-Day-Picker选中周下方插入自定义时段组件

Portal完全符合你的需求,具体实现步骤如下:

  1. 先在组件内引入依赖并定义两个状态,分别存储选中的日期、Portal挂载的目标DOM节点:
import { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';
import DayPicker from 'react-day-picker';
import 'react-day-picker/lib/style.css';
// 你的独立时段选择组件
import TimeSlot from './TimeSlot';
const [selectedDay, setSelectedDay] = useState(null);
const [portalRoot, setPortalRoot] = useState(null);
  1. 修改日期点击事件逻辑,每次点击时先清理之前插入的DOM节点,避免多个时段选择栏同时出现,再为当前选中周创建Portal挂载容器:
const handleDayClick = (day, { selected }, e) => {
  // 清理上一次插入的容器
  if (portalRoot) {
    portalRoot.remove();
    setPortalRoot(null);
  }
  // 取消选中的情况直接返回
  if (selected) {
    setSelectedDay(null);
    return;
  }
  // 定位当前点击日期所属的周节点
  const weekNode = e.target.closest('.DayPicker-Week');
  // 创建新的挂载容器插入到周节点后方
  const newRoot = document.createElement('div');
  weekNode.after(newRoot);
  // 更新状态
  setSelectedDay(day);
  setPortalRoot(newRoot);
};
  1. 在组件的JSX中添加Portal渲染逻辑,将时段组件渲染到指定的DOM节点中:
function App() {
  // 上述状态和事件逻辑
  return (
    <div className="app">
      <DayPicker 
        selectedDays={selectedDay}
        onDayClick={handleDayClick}
      />
      {/* 渲染Portal */}
      {portalRoot && selectedDay && ReactDOM.createPortal(
        <TimeSlot date={selectedDay} />,
        portalRoot
      )}
    </div>
  );
}
  1. 新增卸载清理逻辑,避免内存泄漏:
useEffect(() => {
  return () => {
    if (portalRoot) {
      portalRoot.remove();
    }
  };
}, [portalRoot]);

这种实现方式不需要改动React-Day-Picker的内部逻辑,你的时段组件也可以保持完全独立,所有状态和交互都遵循React的生命周期管理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:27:04