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

React应用react-big-calendar拖拽失效,如何正确配置DndContext?

解决react-big-calendar拖拽事件无效问题

1. 补全依赖安装

新版react-big-calendar的拖拽插件仍然依赖react-dnd和react-dnd-html5-backend,首先需要确认这两个包已经正确安装,执行安装命令:

npm install react-dnd react-dnd-html5-backend
# 或者使用yarn
yarn add react-dnd react-dnd-html5-backend

注意:推荐安装react-dnd@16+版本适配最新版react-big-calendar,避免版本兼容报错

2. 调整代码配置

你当前的代码缺少Dnd后端配置,同时onEventDrop方法没有更新状态,导致拖拽后没有视觉反馈,完整修改后的代码如下:

import React, { Component } from "react";
import { Calendar, momentLocalizer } from "react-big-calendar";
import moment from "moment";
import withDragAndDrop from "react-big-calendar/lib/addons/dragAndDrop";
// 新增引入HTML5Backend
import { HTML5Backend } from 'react-dnd-html5-backend'

import "./App.css";
import "react-big-calendar/lib/addons/dragAndDrop/styles.css";
import "react-big-calendar/lib/css/react-big-calendar.css";

const localizer = momentLocalizer(moment);
// 修改DnDCalendar初始化,传入backend配置
const DnDCalendar = withDragAndDrop(Calendar, { backend: HTML5Backend });

class App extends Component {
  state = {
    events: [
      {
        id: 1, // 新增事件唯一id,方便更新时定位
        start: moment().toDate(),
        end: moment().add(1, "days").toDate(),
        title: "Some title",
      },
    ],
  };

  onEventResize = (data) => {
    const { start, end, event } = data;
    // 优化更新逻辑,不直接修改原状态
    const updatedEvents = this.state.events.map(ev => {
      if (ev.id === event.id) {
        return {...ev, start, end}
      }
      return ev
    })
    this.setState({ events: updatedEvents });
  };

  onEventDrop = (data) => {
    const { start, end, event } = data;
    // 新增drop后的状态更新逻辑,修改对应事件的时间
    const updatedEvents = this.state.events.map(ev => {
      if (ev.id === event.id) {
        return {...ev, start, end}
      }
      return ev
    })
    this.setState({ events: updatedEvents });
  };

  render() {
    return (
        <div className="App">
          <DnDCalendar
              defaultDate={moment().toDate()}
              defaultView="month"
              events={this.state.events}
              localizer={localizer}
              onEventDrop={this.onEventDrop}
              onEventResize={this.onEventResize}
              resizable
              style={{ height: "100vh" }}
          />
        </div>
    );
  }
}

export default App;

3. 可选配置方案

如果上述配置仍然无效,也可以选择用DndProvider包裹根组件,和在withDragAndDrop中传backend参数效果一致,二选一即可,不要同时配置避免冲突:
在项目入口index.js中修改:

import { DndProvider } from 'react-dnd'
import { HTML5Backend } from 'react-dnd-html5-backend'

ReactDOM.render(
  <DndProvider backend={HTML5Backend}>
    <App />
  </DndProvider>,
  document.getElementById('root')
)

修改完成后重启项目即可正常拖拽移动/缩放日历事件,若仍有问题可检查浏览器控制台的报错信息,调整对应依赖版本即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:39:04