【问题标题】:How to populate modal on event click?如何在事件点击时填充模式?
【发布时间】:2019-05-23 10:01:16
【问题描述】:

目前使用 ReactJS 设置 FullCalendar。我可以填充我的日历和事件,但在使用 eventClick={} 时遇到问题。如何使用eventClick={} 填充模式并检索事件信息?

当点击事件时,我设法让模式出现,但我似乎无法通过任何数据

当前代码

constructor() {
        super();
        this.state = {
            modal: false
        };

        this.toggle = this.toggle.bind(this);
    };

    toggle() {
        this.setState(prevState => ({
            modal: !prevState.modal
        }));
    }

----
  //I then render the calendar and modal inside the div.

<div id="calendar" class="container" ref="calendar">
                <FullCalendar
                    header={{
                        left: 'prev,next today',
                        center: 'title',
                        right: 'dayGridMonth, listWeek'
                    }}
                    selectable={true}
                    height={650}
                    aspectRatio={2}
                    plugins={[interaction, dayListPlugin, dayGridPlugin, bootstrapPlugin]}
                    themeSystem="bootstrap"
                    weekends={false}
                    displayEventTime={true}
                    timeZone="UTC"
                    events={jsonFeed}
                    eventRender={this.handleEventRender}
                    eventClick={this.toggle}
                />
            <Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
            <ModalHeader toggle={this.toggle}>testTitle</ModalHeader>
            <ModalBody>test body</ModalBody>
            <ModalFooter>
                <Button color="primary" onClick={this.toggle}>Do Something</Button>{' '}
                <Button color="secondary" onClick={this.toggle}>Cancel</Button>
            </ModalFooter>
        </Modal>
            </div>

所以在这里,当我单击事件/关闭按钮时,模式会出现和消失,但我无法通过单击事件传递数据。我希望有人能提供帮助。我似乎无法做到这一点。

【问题讨论】:

  • &lt;FullCalendar 不是有效的 JavaScript。你在使用一些插件吗?如果有,请说明它是什么。我也看不出这与 NodeJS 有什么关系,NodeJS 是一个服务器端框架,不能在浏览器中运行。
  • 你可能在用这个吗? fullcalendar.io/docs/react 。如果是这样,那么也许您的意思是在您的问题中说“ReactJS”而不是“NodeJS”??
  • @ADyson 我确实在使用 React,我在另一个项目的大脑上有节点。哎呀
  • 没问题。好的,所以我给你的链接的“回调”部分解释了如何处理诸如 eventClick 之类的回调。我建议您通过您可以定义的函数来处理它,并使用它来切换您的模式,并使用事件数据填充模式(作为回调的参数提供 - 请参阅fullcalendar.io/docs/eventClick)。
  • @ADyson 谢谢,你知道我会如何渲染它吗?所以我已经把它改成了一个函数,但我就是不知道要写什么来渲染它?反应DOM?但后来我不知道我需要传递什么才能让它显示出来。

标签: javascript reactjs fullcalendar fullcalendar-4


【解决方案1】:

你的问题是“所以当我点击事件/关闭按钮时,我会看到模态出现和消失......”但是在 cmets 中你说“但我只是想不出要写什么来渲染它” .

我将假设 Modal 正在呈现,问题是您不确定如何使用 eventClick 回调。

ADyson 发现了您遇到的问题。您已经设置了回调,FullCalendar 将您的切换函数视为触发event click 时要调用的函数。当你的切换函数被调用时,它将传递一个 eventClickInfo 对象,让你可以访问事件、HTML 元素、jsEvent 和视图。

因此,将您的切换更改为此将使您可以访问该事件:

toggle(eventClickInfo) {
  console.log(eventClickInfo);

  this.setState(prevState => ({
    modal: !prevState.modal
  }));
}

*我会将名称更改为 handleEventClick 或 eventClick。

更新 1: 根据上面的 cmets,我已经获取了您的 code sandbox 并进行了更新。我更改了以下内容:

  1. 将模态框移到渲染函数中,以便对其进行渲染,然后从状态更新。
  2. 将事件添加到状态对象,因此当您单击事件时,它会更新。这就是对话框中呈现的内容。
  3. 将 div 上的 class 更改为 className,id 为日历,因为这是 React 中的标准,因为 class 是 JS 中的关键字。

    class Calendar extends React.Component {
      state = {
        modal: false,
        event: {
          title: "",
          start: new Date()
        }
      };
    
      toggle = () => {
        this.setState({ modal: !this.state.modal });
      };
    
      handleEventClick = ({ event, el }) => {
        this.toggle();
        this.setState({ event });
      };
    
      render() {
        return (
          <div id="calendar" className="container" ref="calendar">
            <FullCalendar
              header={{
                left: "prev,next today",
                center: "title",
                right: "dayGridMonth, listWeek"
              }}
              selectable={true}
              plugins={[interaction, dayListPlugin, dayGridPlugin, bootstrapPlugin]}
              themeSystem="bootstrap"
              weekends={false}
              displayEventTime={true}
              timeZone="UTC"
              events={[
                { title: "event 1", date: "2019-05-01" },
                { title: "event 2", date: "2019-05-02" }
              ]}
              eventRender={this.handleEventRender}
              eventClick={this.handleEventClick}
            />
            <Modal
              isOpen={this.state.modal}
              toggle={this.toggle}
              className={this.props.className}
            >
              <ModalHeader toggle={this.toggle}>
                {this.state.event.title}
              </ModalHeader>
              <ModalBody>
                <div>
                  <p>{this.state.event.start.toISOString()}</p>
                </div>
              </ModalBody>
              <ModalFooter>
                <Button color="primary">Do Something</Button>{" "}
                <Button color="secondary" onClick={this.toggle}>
                  Cancel
                </Button>
              </ModalFooter>
            </Modal>
          </div>
        );
      }
    }
    

【讨论】:

  • 非常感谢,这真的很有帮助!我开始拔头发。您不仅给了我解决方案,还给了我一个解释:)祝您星期一愉快。
  • 不客气,请记住,您必须将您关心的任何其他属性添加到本地状态的事件对象中。
  • 是的 - 你知道我将如何通过类似于 extendedProp 的东西吗?我在获取该信息时遇到问题,但能够从活动中获取所有其他信息。
  • extendedProp 本身就是一个对象,因此您正在查看嵌套状态。看看这个:stackoverflow.com/a/43041334/3891834
  • 非常感谢
【解决方案2】:

在您的按钮上(样式化组件),

<Button type="button" color="primary" onClick={e => toggle(e)}>Toggle Button</Button>

也在你的 handleToggle() 上

toggle = event => {
 // event.preventDefault() or manipulate something with the @param
 this.setState(prevState => ({ modal: !prevState.modal }))
}

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2011-05-01
    • 2020-10-24
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多