javascript - react 大日历,将 Bootstrap 弹出窗口添加到事件?

标签 javascript twitter-bootstrap reactjs

看起来您可以为 React 日历组件创建自定义组件。我在看这个例子:

https://github.com/intljusticemission/react-big-calendar/blob/master/examples/demos/customView.js .

但不清楚如何创建自定义事件组件。我也查看了文档,但没有明确的示例:

http://intljusticemission.github.io/react-big-calendar/examples/index.html#prop-components

我特别感兴趣的是为每个事件创建一个工具提示,以显示更详细的事件描述。

谁能举个例子说明有人为 react-big-calendar 创建了自定义组件?

更新: 这是日历的图像和在月 View 中呈现的一些事件。我在想,自定义事件绝对应该包括“rbc-event”和“rbc-event-content”。要添加 Bootstrap 工具提示,我在自定义事件组件中考虑这样的事情:

enter image description here

这里是在 react-big-calendar 源代码中创建事件单元组件的地方。

    return _react2.default.createElement(
              'div',
              _extends({}, props, {
                style: _extends({}, props.style, style),
                className: (0, _classnames2.default)('rbc-event', className, xClassName, {
                  'rbc-selected': selected,
                  'rbc-event-allday': isAllDay || _dates2.default.diff(start, _dates2.default.ceil(end, 'day'), 'day') > 1,
                  'rbc-event-continues-prior': continuesPrior,
                  'rbc-event-continues-after': continuesAfter
                }),
                onClick: function onClick() {
                  return onSelect(event);
                }
              }),
              _react2.default.createElement(
                'div',
                { className: 'rbc-event-content', title: title },
                Component ? _react2.default.createElement(Component, { event: event, title: title }) : title
              )
    );
  }
});

exports.default = EventCell;
module.exports = exports['default'];

我决定尝试扩展 EventCell 组件,当我将它作为事件组件 prop 传入时,事件不再有任何内容。不确定如何将事件详细信息传递到 EventCell 组件内的“rcb-event”div。见下文..

import React, { PropTypes } from 'react';
import MyCalendar from '../components/bigCalendar';
import _ from 'lodash';
import EventCell from 'react-big-calendar/lib/EventCell.js';

class MyEvent extends React.Component {
    constructor(props){
        super(props)
    }
    render(){
        return (
            <div className="testing">
                <EventCell />
            </div>
        );
    }
}

let components = {
    event: MyEvent
}

在这里,我将刚刚创建的组件对象传递给 MyCalendar 演示组件:

export default class Calendar extends React.Component {
    constructor(props) {
        super(props);

        var eventsList = Object.keys(props).map(function(k){
            return props[k];
        });

        eventsList.map(function(event){
            event["start"] = new Date(event["start"])
            event["end"] = new Date(event["end"])
        })

        this.state = {
            events: eventsList
        };
    };

    render() {
        return (
            <div>
                <MyCalendar components={components} events={this.state.events}/>
            </div>
        );
    }
}

最后,通过 props 将组件对象传递给展示组件。它在 View 中成功呈现,但正如我之前所说 - 没有内容。

const MyCalendar = props => (
    <div className="calendar-container">
        <BigCalendar
            selectable
            popup
            components={props.components}
            views={{month: true, week: true, day: true}}
            events={props.events}
            onSelectEvent={event => onSelectEvent(event)}
            eventPropGetter={eventStyleGetter}
            scrollToTime={new Date(1970, 1, 1, 6)}
            defaultView='month'
            defaultDate={new Date(2015, 3, 12)}
            />
    </div>
);

MyCalendar.propTypes = {
    events: PropTypes.array.isRequired,
    components: PropTypes.object.isRequired
};

看来我应该用另一种方式来解决这个问题...有什么建议吗?

最佳答案

这是我想出的,我相信它可以被清理 - 但它确实有效。

创建自定义事件组件,其中包括弹出内容。

import React, { PropTypes } from 'react';
import MyCalendar from '../components/bigCalendar';
import _ from 'lodash';

class MyEvent extends React.Component {
    constructor(props){
        super(props)
    }
    componentDidMount(){
        MyGlobal.popOver();
    }
    render(){
        return (
        <div>
            <div    className="custom_event_content"
                    data-toggle="popover"
                    data-placement="top"
                    data-popover-content={"#custom_event_" + this.props.event.id}
                    tabIndex="0"
                    >
                {this.props.event.title}
            </div>

            <div className="hidden" id={"custom_event_" + this.props.event.id} >
              <div className="popover-heading">
                {this.props.event.driver}
              </div>

              <div className="popover-body">
                {this.props.event.title}<br/>
              </div>
            </div>
        </div>
        );
    }
}

let components = {
    event: MyEvent
}

export default class Calendar extends React.Component {
    constructor(props) {
        super(props);

        var eventsList = Object.keys(props).map(function(k){
            return props[k];
        });

        eventsList.map(function(event){
            event["start"] = new Date(event["start"])
            event["end"] = new Date(event["end"])
        })

        this.state = {
            events: eventsList
        };
    };

    render() {
        return (
            <div>
                <MyCalendar components={components} events={this.state.events}/>
            </div>
        );
    }
}

添加事件监听器:

MyGlobal.popOver = function(){
    $('body').on('click', function (e) {
        //did not click a popover toggle or popover
        if ($(e.target).data('toggle') !== 'popover'
            && $(e.target).parents('.popover.in').length === 0) {
            $('[data-toggle="popover"]').popover('hide');
        }
    });

    $("[data-toggle=popover]").popover({
        html : true,
        container: 'body',
        content: function() {
            var content = $(this).attr("data-popover-content");
            return $(content).children(".popover-body").html();
        },
        title: function() {
            var title = $(this).attr("data-popover-content");
            return $(title).children(".popover-heading").html();
        }
    });
}

将自定义 Prop 传递给 MyCalendar 演示组件:

const MyCalendar = props => (
    <div className="calendar-container">
        <BigCalendar
            selectable
            popup
            components={props.components}
            views={{month: true, week: true, day: true}}
            events={props.events}
            onSelectEvent={event => onSelectEvent(event)}
            eventPropGetter={eventStyleGetter}
            scrollToTime={new Date(1970, 1, 1, 6)}
            defaultView='month'
            defaultDate={new Date(2015, 3, 12)}
            />
    </div>
);

MyCalendar.propTypes = {
    events: PropTypes.array.isRequired,
    components: PropTypes.object.isRequired
};

关于javascript - react 大日历,将 Bootstrap 弹出窗口添加到事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38822238/

相关文章:

javascript - 我可以将彩盒固定在头上吗?

javascript - 具有多个按钮的 Jquery 调用一个发送不同参数的函数

javascript - 悬停时弹出,从 Mysql 数据库填写

javascript - 从另一个页面获取 Bootstrap 的模态内容

reactjs - 有没有办法将 props 隐式传递给组件?

javascript - 如何显示 select2 的选定值?

javascript - 在 jquery 中使用 .change() 和日期选择器提交表单

php - cakephp 3.x 日期时间容器模板

javascript - 如何使用 React JS 在 Material UI 中使整个 Card 组件可点击?

reactjs - react 路由器 : Add entry to history without changing route