简体   繁体   中英

Popper.js how to enable it on click

I need to make a generic popover component for displaying things like filters and menus in an element over the page. For that I am using Popper.js

How to enable popover on users click? I did not see any "close" and "popup" methods in Popper.js object. Popover component should be triggered clicking on button or hover on a element.

to open Popover element I shoud use in parent component this

<ci-popover>
  <template
    slot-scope="popover"
    #action
  >
    <ci-button @click="popover.toggle()">
      Open Popover
    </ci-button>
  </template>
  <!-- Popover content -->
</ci-popover>

Popover component

<template>
  <div :class="[ci-popover, `ci-popover--background-color-${variant}`,`ci-divider--padding-${padding}`]">
    <div ref="button">
    <slot name="action" :toggle="toggle" :close="close"></slot>
     </div>
    <div ref="tooltip">
      <h1>Hello popover</h1>
    </div>
    </div>
</template>

<script lang="ts">
  /*some imports*/
  import { createPopper, Instance } from '@popperjs/core';

  @Component
  export default class CiPopover extends Vue {
    /*Props*/

    created() {
      this.onOpen();
    }
    beforeDestroy() {
      this.onClose();
    }

    public close(): void {
      console.log('close method');
      
    }
    public toggle(): void {
      console.log('toggle method');//shoud "trigger" popover to show
    }

    @Emit('open')
    onOpen() {
      console.log("emit:open")
    }
    @Emit('close')
    onClose() {
      console.log("emit:close");
    }
    popperInstance = null as Instance | null
    mounted() {
      this.popperInstance = createPopper(this.$refs.button, this.$refs.tooltip, {
        placement: 'top',
      });
    } 
  }
</script>
<ci-popover variant="emphasis"
                padding="md"
                placement="top"
                @open="ciPopoverOnOpen"
                @close="ciPopoverOnClose">
      <template slot-scope="popover" slot="action">

        <ci-button @click="popover.toggle()">
          Open Popover
        </ci-button>
        <ci-button @click="popover.close()">
          Close popover
        </ci-button>
      </template>
      <!-- Popover content -->
      
    </ci-popover>

It looks like you are using popper.js and so my answer will be based on that library.

I did not see any "close" and "popup" methods in Popper.js object.

It does not have show/hide methods because it is only a positioning engine.

It does however have method for updating/destroying an instance.

Popover component should be triggered clicking on button or hover on a element.

You can just instead create an instance when you click/hover an element then.

<template>
  <div>
    <div ref="reference">
      Something
    </div>

    <button
      ref="button"
      @click="onButtonClick"
    >
      Trigger
    </button>
  </div>
</template>

<script>
import { createPopper } from "@popperjs/core";

export default {
  data() {
    return {
      popper: null,
    }
  },

  methods: {
    onButtonClick() {
      if (this.popper === null) {
        this.popper = createPopper(this.$refs.button, this.$refs.reference, { ...yourOptions })
      } else {
        this.popper.destroy()
        this.popper = null
      }
    }
  },

  beforeDestroy() {
    if (this.popper !== null) {
      this.popper.destroy()
    }
  }
}
</script>

You might get away with just using one instance of popper instead of creating/destroying always but that's for you to decide and to figure out.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM