【问题标题】:React Fullcalendar v4 tooltipReact Fullcalendar v4 工具提示
【发布时间】:2019-12-03 06:38:49
【问题描述】:

Fullcalendar React 组件:

import FullCalendar from "@fullcalendar/react";
import timeGrid from "@fullcalendar/resource-timegrid";
import resourceDayGridPlugin from '@fullcalendar/resource-daygrid';

class FC extends React.Component {
  calendarComponentRef = React.createRef();

  constructor(props) {
    super(props);    
    this.state = {
        events:[{ "id": 1, "title": "event 1", "description":"some description"},......]
    }  
  }

  eventRender(info){
    var tooltip = new Tooltip(info.el, {
      title: info.event.extendedProps.description,
      placement: 'top',
      trigger: 'hover',
      container: 'body'
    });
  }

  render() {
    return <FullCalendar                  
          events={this.state.getEvents}          
          defaultView="resourceTimeGridDay"
      plugins={[timeGrid, interactionPlugin, resourceDayGridPlugin]}
          eventRender={this.eventRender}
          schedulerLicenseKey="GPL-My-Project-Is-Open-Source"
        />

  }
}

Tooltip.js 包含在标题中

<script src="https://unpkg.com/popper.js/dist/umd/popper.min.js"></script>
<script rc="https://unpkg.com/tooltip.js/dist/umd/tooltip.min.js">/script>

在反应中完全尝试这个demo,但它在反应版本中不起作用。

但工具提示不起作用

Fullcalendar 反应示例项目sample project react fullcalendar

【问题讨论】:

  • 你的函数绑定到组件了吗?
  • 你能提供一个 JSfiddle 链接让我看看吗?
  • @FrankAK 完成
  • 您能否制作一个最小的、可重现的示例,最好使用 CodePen 或 JSFiddle 之类的。从这里发布的少量断章取义的代码中无法判断出什么是错误的。请参阅 stackoverflow.com/help/minimal-reproducible-example 以获取有关包含内容的指导
  • 首先要验证的是,eventRender() 函数是否确实在执行?您可以添加日志命令,或使用调试器查找。然后我们可以直接将其缩小到工具提示的问题

标签: reactjs fullcalendar tooltip popper.js fullcalendar-4


【解决方案1】:

迄今为止我做得最好的。这至少会给事件一个标题。

<FullCalendar eventDidMount={renderEventContent} .....

function renderEventContent(info) {
  info.el.setAttribute('title', info.event.title)
}

【讨论】:

    【解决方案2】:

    FullCalendar v5

    content injection hook 例如对于Material-ui tooltip

    eventContent: ( arg ) => {
        return (
            <Tooltip title={ <Typography color="inherit">Tooltip with HTML</Typography> } arrow>
                { renderInnerContent( arg ) }
            </Tooltip>
        );
    }
    
    

    如果您想拥有与默认完全相同的内容,则从 fullcalendar 源中复制该函数:

    /**
     * https://github.com/fullcalendar/fullcalendar/blob/495d925436e533db2fd591e09a0c887adca77053/packages/common/src/common/StandardEvent.tsx#L79
     */
    function renderInnerContent( innerProps ) {
        return (
            <div className='fc-event-main-frame'>
                { innerProps.timeText &&
                <div className='fc-event-time'>{ innerProps.timeText }</div>
                }
                <div className='fc-event-title-container'>
                    <div className='fc-event-title fc-sticky'>
                        { innerProps.event.title || <Fragment>&nbsp;</Fragment> }
                    </div>
                </div>
            </div>
        );
    }
    

    要将ListView 内容与默认内容区分开来,您可以使用此代码(给定Calendar reference calendarRef):

    eventContent: ( arg ) => {
        const data = calendarRef.current.getApi().getCurrentData();
        const viewSpec = data.viewSpecs[arg.view.type];
        let innerContent;
        if (viewSpec.component === ListView) {
            /**
             * https://github.com/fullcalendar/fullcalendar/blob/495d925436e533db2fd591e09a0c887adca77053/packages/list/src/ListViewEventRow.tsx#L55
             */
            innerContent = renderListInnerContent( arg );
        } else {
            innerContent = renderInnerContent( arg );
        }
        return ( <Tooltip ... >{ innerContent }</Tooltip>);
    };
    

    【讨论】:

    • 有趣,感谢您的补充。有没有办法从库中导入它,这样它就不会被复制和粘贴?
    • 不幸的是,在这方面没有取得任何进展。 Lib 不导出这些组件或提供对默认组件的访问:github.com/fullcalendar/fullcalendar/issues/5927
    【解决方案3】:

    使用 tippy 和 eventMouseEnter 的工具提示

        handleMouseEnter = (arg) =>{
        tippy(arg.el, {
            content: "my tooltip!"
        });
    }
    

    在组件中

    render() {
        return (
                <FullCalendar ref={this.calendarRef}
                              plugins={[dayGridPlugin, interactionPlugin]}
                              initialView="dayGridMonth"
                              weekends={true}
                              eventMouseEnter={this.handleMouseEnter}
    
                />
        )
    }
    

    【讨论】:

      【解决方案4】:

      使用Tooltip.js的工具提示

      eventRender(info){
          var tooltip = new Tooltip(info.el, {
            title: info.event.extendedProps.description,
            placement: 'top',
            trigger: 'hover',
            container: 'body'
          });
        }
      

      在组件中:

      render() {
          return <FullCalendar                  
                events={this.state.getEvents}          
                defaultView="resourceTimeGridDay"
            plugins={[timeGrid, interactionPlugin, resourceDayGridPlugin]}
                eventRender={this.eventRender}
                schedulerLicenseKey="GPL-My-Project-Is-Open-Source"
              />
      
        }
      

      使用react-tooltip

      import ReactTooltip from 'react-tooltip'
      

      以及处理eventPosition的方法

      handleEventPositioned(info) {
        info.el.setAttribute("data-tip","some text tip");
         ReactTooltip.rebuild();
       }
      

      render() {
              return <FullCalendar                  
                    events={this.state.getEvents}          
                    defaultView="resourceTimeGridDay"
                plugins={[timeGrid, interactionPlugin, resourceDayGridPlugin]}
                    eventPositioned={this.handleEventPositioned}
                    schedulerLicenseKey="GPL-My-Project-Is-Open-Source"
                  />
      
            }
      

      【讨论】:

      • 它对我不起作用。当我尝试实施你时,它仍然无法正常工作。
      • react-tooltip 不适合我(使用 fullcalendar v5)
      • tooltip.js 是从哪里来的?我也在尝试在我的日历中实现工具提示功能,并且我正在使用 React。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2015-01-16
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多