【问题标题】:React BigCalendar drag and drop example not workingReact BigCalendar拖放示例不起作用
【发布时间】:2018-11-16 22:44:37
【问题描述】:

我刚刚浏览了 BigCalendar 拖放示例 HERE。我尝试自己创建一个本地拖放示例,只是为了看看拖放如何与 BigCalendar 一起工作。我创建了以下内容:

Dnd.js

import React from 'react'
import events from './events'
import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContext } from 'react-dnd'
import BigCalendar from 'react-big-calendar'
import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop';
import 'react-big-calendar/lib/css/react-big-calendar.css';

import 'react-big-calendar/lib/addons/dragAndDrop/styles.less';

const DragAndDropCalendar = withDragAndDrop(BigCalendar)

class Dnd extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      events: events,
    }

    this.moveEvent = this.moveEvent.bind(this)
  }

  moveEvent({ event, start, end }) {
    const { events } = this.state

    const idx = events.indexOf(event)
    const updatedEvent = { ...event, start, end }

    const nextEvents = [...events]
    nextEvents.splice(idx, 1, updatedEvent)

    this.setState({
      events: nextEvents,
    })

    alert(`${event.title} was dropped onto ${event.start}`)
  }

  resizeEvent = (resizeType, { event, start, end }) => {
    const { events } = this.state

    const nextEvents = events.map(existingEvent => {
      return existingEvent.id == event.id
        ? { ...existingEvent, start, end }
        : existingEvent
    })

    this.setState({
      events: nextEvents,
    })

    alert(`${event.title} was resized to ${start}-${end}`)
  }

  render() {
    return (
      <DragAndDropCalendar
        selectable
        events={this.state.events}
        onEventDrop={this.moveEvent}
        resizable
        onEventResize={this.resizeEvent}
        defaultView="week"
        defaultDate={new Date(2015, 3, 12)}
      />
    )
  }
}

export default DragDropContext(HTML5Backend)(Dnd)

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Knight from './knight/knight';
import Square from './square/square';
import Board from './board/board';
import Dnd from './bigcalender/dnd';
import { moveKnight , observe } from './game';
import BigCalendar from 'react-big-calendar'
import SimpleDrag from './simpleDrag/simpleDrag';
import moment from 'moment';

BigCalendar.momentLocalizer(moment);

const rootEl = document.getElementById('root');

ReactDOM.render(
    <Dnd />,
    rootEl
)

日历显示所有事件都很好,问题是拖放功能不太有效。该代码几乎是来自BigCalendar drag and drop source code 源的复制粘贴。那么为什么拖放示例在我的项目中不起作用?

我在本地创建的示例也可以看到我的 repo here

【问题讨论】:

  • 你能测试我的答案了吗?根据我的答案中的一行更改,我能够在您的回购中得到这个工作。
  • @grizzthedj 请帮助解决以下问题。 stackoverflow.com/questions/57063473/…

标签: reactjs react-dnd react-big-calendar


【解决方案1】:

默认情况下,create-react-app 似乎不支持 LESS,因此您的Dnd.js 中的dragAndDrop.less 导入不起作用。

您可以在项目中设置 LESS,也可以直接导入 .css 文件,因为它已经存在。

要使用.css 文件,请在dnd.js 文件中更改此导入...

import 'react-big-calendar/lib/addons/dragAndDrop/styles.less';

到这个...

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

【讨论】:

  • 是的,它有效!非常感谢,我正在度假,因此回复晚了。道歉:)
【解决方案2】:

检查您的样式加载器。可能并非所有样式都按应有的方式应用,拖放需要大量的 CSS 定位。我的项目中有类似的问题。

【讨论】:

    【解决方案3】:
     import React, { Component } from 'react';
     import moment from 'moment';
    
     import BigCalendar from 'react-big-calendar';
    
     import withDragAndDrop from "react-big-calendar/lib/addons/dragAndDrop";
    
     import "react-big-calendar/lib/addons/dragAndDrop/styles.css";
     import "react-big-calendar/lib/css/react-big-calendar.css";
    
     const DragAndDropCalendar = withDragAndDrop(BigCalendar);
     const localizer = BigCalendar.momentLocalizer(moment)
    
     class Calendar extends Component {
       constructor(props) {
        super(props);
        this.state = {
            events: [
                {
                    start: new Date(),
                    end: new Date(),
                    title: "Some title",
                    id: 1,
                    allDay: false,
                },
                {
                    start: new Date('Wed Jan 30 2019 10:06:44 GMT+0200'),
                    end: new Date('Thu Jan 31 2019 10:06:44 GMT+0200'),
                    title: "Some another title",
                    id: 2,
                    allDay: false,
                }
            ]
        };
        this.onEventDrop = this.onEventDrop.bind(this);
        this.onEventResize = this.onEventResize.bind(this);
    }
    
    onEventResize({event, start, end}){
        const { events } = this.state
        const nextEvents = events.map(existingEvent => {
          return existingEvent.id === event.id
            ? { ...existingEvent, start, end }
            : existingEvent
        })
    
        this.setState({
          events: nextEvents,
        })
    }
    
    onEventDrop({ event, start, end }) {
        const { events } = this.state;
        const idx = events.indexOf(event);
        const updatedEvent = { ...event, start, end };
        const nextEvents = [...events];
        nextEvents.splice(idx, 1, updatedEvent);
        this.setState({
          events: nextEvents,
        })
    }
    
    
    render() {
        const { events } = this.state;
        return (
            <div>
                <DragAndDropCalendar
                    style={{ height: '100vh' }}
                    localizer={localizer}
                    culture="en-GB"
                    events={events}
                    defaultDate={new Date()}
                    defaultView="month"
                    startAccessor="start"
                    endAccessor="end"
                    titleAccessor="title"
                    onEventResize={this.onEventResize}
                    onEventDrop={this.onEventDrop}
                    resizable
                    selectable
                />
            </div>
        );
      }
     }
    
    export default Calendar;
    

    【讨论】:

    • 欢迎来到 SO。请为您的答案添加一些解释。
    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2016-07-10
    • 2015-08-10
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多