简体   繁体   English

为什么 Popper 在 vuejs 中抛出错误 Popper: Invalid reference or popper argument provided"

[英]Why Popper throws error Popper: Invalid reference or popper argument provided" in vuejs

I have wrote component in vue.js 2.6 what uses Propper.js.我在 vue.js 2.6 中编写了使用 Propper.js 的组件。

Component is -generic popover component for displaying things like filters and menus in an element over the page.组件是通用的弹出框组件,用于在页面上的元素中显示过滤器和菜单等内容。

For passing data into Popover function I am using refs maybe this is case?为了将数据传递到 Popover function 我正在使用 refs 也许是这种情况?

Console throws error and says.控制台抛出错误并说。

Popper: Invalid reference or popper argument provided. Popper:提供的引用或 popper 参数无效。 They must be either a DOM element or virtual element.它们必须是 DOM 元素或虚拟元素。

<template>
  <div>
    <div ref="popcorn" aria-describedby="tooltip">
      <slot name="action" :toggle="toggle" :close="close"></slot>
    </div>

    <div ref="tooltip" role="tooltip" v-if="isOpen">
      <div :class="[ci-popover, `ci-popover--background-color-${variant}`,`ci-divider--padding-${padding}`]">
        <slot name="default" />
        {{placement}}
      </div>
    </div>
  </div>
</template>

<script lang="ts">
  import { Vue, Component, Prop, Emit } from "vue-property-decorator";
  import { oneOfOptions } from "../../helpers/PropertyValidators";
  import { CiPopoverBackgroundColor, ciPopoverBackgroundColorArray } from './popover-background-color';
  import { CiPopoverPlacement, ciPopoverPlacementArray } from './popover-placement';
  import { CiSpacing, CiSpacingArray } from '../component-spacing';
  import { createPopper, Instance, VirtualElement } from '@popperjs/core';

  @Component
  export default class CiPopover extends Vue {
    $refs!: {
      popcorn: Element,
      tooltip: HTMLElement
    }
    /*Props/*


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

    public close(): void {
      console.log('close method');

      console.log(this.$refs.tooltip);
      console.log(typeof this.$refs.tooltip);
    }
    public toggle(): void {
      console.log('toggle method');
      this.isOpen = true;
      console.log(this.$refs.popcorn);
      console.log(typeof this.$refs.popcorn);

    }

    @Emit('open')
    onOpen() {
      console.log("emit:open")
    }
    @Emit('close')
    onClose() {
      console.log("emit:close");
    }
    popperInstance = null as Instance | null
    isOpen = false;

    mounted() {
      this.popperInstance = createPopper(this.$refs.popcorn , this.$refs.tooltip, {
        placement: 'top'
      });  
    }
  }
</script>

Question is how to solve this problem?问题是如何解决这个问题?

Because the tooltip element is not rendered and so you are referencing to nothing.因为未呈现工具提示元素,所以您没有引用任何内容。

Your tooltip element looks like:您的工具提示元素如下所示:

    <div ref="tooltip" role="tooltip" v-if="isOpen">
      <div :class="[ci-popover, `ci-popover--background-color-${variant}`,`ci-divider--padding-${padding}`]">
        <slot name="default" />
        {{placement}}
      </div>
    </div>

It depends on the state isOpen if it should be rendered and you start with false as value as seen in:它取决于 state isOpen是否应该呈现它,并且您从false作为值开始,如下所示:

isOpen = false

On mounted, you createPopper right away but you did not open the tooltip yet.安装后,您会立即createPopper ,但尚未打开工具提示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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