Добавить всплывающее окно начальной загрузки программно, vue-полный календарь

#vuejs2 #fullcalendar #bootstrap-vue #bootstrap-popover #fullcalendar-4

#vuejs2 #полный календарь #bootstrap-vue #bootstrap-всплывающее окно #полный календарь-4

Вопрос:

Моя конечная цель — добавить всплывающее окно Bootstrap 4 в полный календарь для отображения описаний событий календаря, поскольку в зависимости от вида Полный календарь отключает заголовок / описание. Поскольку полный календарь генерирует все на основе реквизита events, который я ему передаю, я не смог понять, как добавить всплывающее окно любого рода. (Вероятно, я мог бы сделать это с помощью jQuery, но я действительно пытаюсь вырезать jQuery из проекта, чтобы уменьшить размер моей сборки)

Здесь есть отличная документация по нормальному использованию всплывающего окна с bootstrap vue: https://bootstrap-vue.js.org/docs/directives/popover /

К сожалению, полный календарь не предоставляет возможности использовать ни один из методов, описанных в документах Boostrap-Vue. Одна вещь, которую я пробовал, но не сработала, заключалась в следующем

 <template>
  <full-calendar
    :events="events"
    @eventRender="eventRender"
  ></full-calendar>
</template>

<script>
  import FullCalendar from '@fullcalendar/vue'

  export default{
    data(){
      events: [...],
    },
    methods: {
      eventRender(info){
        info.el.setAttribute('v-b-popover.hover.top', 'Popover!')
      }
    }
  } 
</script>
  

Это добавляет атрибут в HTML, но я предполагаю, что это после того, как Vue обработает DOM, потому что он не добавляет всплывающее окно.

Есть ли какой-либо другой способ использовать параметры info объекта, переданного функции eventRender, для добавления всплывающего окна? (Документы по функции eventRender:https://fullcalendar.io/docs/eventRender )

Ответ №1:

Вы можете использовать BPopover с помощью propsData в bootstrap-vue следующим образом:

 import { BPopover } from 'bootstrap-vue'
...
methods: {
  ...
  onEventRender: function (args) {
    //console.log(args)
    let titleStr = 'xxxx'
    let contentStr = 'xxxx'

    new BPopover({propsData: {
      title: titleStr,
      content: contentStr,
      placement: 'auto',
      boundary: 'scrollParent',
      boundaryPadding: 5,
      delay: 500,
      offset: 0,
      triggers: 'hover',
      html: true,
      target: args.el,
    }}).$mount()
  }
}
  

несмотря на то, что propsData является значением для теста … https://v2.vuejs.org/v2/api/index.html#propsData

Ответ №2:

Хорошо, потратив некоторое время на чтение кода Boostrap-Vue и немного поиграв, я смог заставить его работать!

Вот сокращенная версия компонента с работающим всплывающим окном:

 <template>
  <full-calendar
    :events="events"
    @eventRender="eventRender"
  ></full-calendar>
</template>

<script>
  import FullCalendar from '@fullcalendar/vue'
  import PopOver from 'bootstrap-vue/src/utils/popover.class'

  export default{
    data(){
      events: [...],
    },
    methods: {
      eventRender(info){
        // CONFIG FOR THE PopOver CLASS
        const config = {
          title: 'I am a title',
          content: "This text will show up in the body of the PopOver",
          placement: 'auto', // can use any of Popover's placements(top, bottom, right, left etc)
          container: 'null', // can pass in the id of a container here, other wise just appends to body
          boundary: 'scrollParent',
          boundaryPadding: 5,
          delay: 0,
          offset: 0,
          animation:true,
          trigger: 'hover', // can be 'click', 'hover' or 'focus'
          html: false, // if you want HTML in your content set to true.
        }

        const target = info.el;
        const toolpop = new PopOver(target, config, this.$root);

        console.log('TOOLPOP', toolpop);
      },
    }
  } 
</script>