【问题标题】:Cannot import Popper.js in VueJS无法在 VueJS 中导入 Popper.js
【发布时间】:2020-09-05 14:51:33
【问题描述】:

我关注 this tutorial 是为了学习如何在我的 VueJS 应用程序中制作弹出框。 当我编译项目时,我收到一条错误消息:

[Vue warn]: Error in data(): "TypeError: _popperjs_core__WEBPACK_IMPORTED_MODULE_0__.default is undefined"

我将问题追溯到 BasePopover.vue 组件 - 第一行 <script> 表示 import Popper from "popper.js"; 在我的应用程序中,我将其更改为 import Popper from "@popperjs/core";,但错误仍然不断出现。

所以我按照官方Popper.js tutorial 来简化事情。 我通过npm i @popperjs/core 安装(也尝试使用VueCLI 如下图所示并通过npm install @popperjs/core --save)。

这是我当前的代码:

<template>
  <div id="app">
    <button id="button" aria-describedby="tooltip">My button</button>
    <div id="tooltip" role="tooltip">My tooltip</div>
  </div>
</template>

<script>
//import Popper from "@popperjs/core/lib/popper";
import Popper from "@popperjs/core";
export default {
  name: "TestView",
  components: {
  },

  data() {
    
      const button = document.querySelector('#button');
      const tooltip = document.querySelector('#tooltip');

      Popper.createPopper(button, tooltip);
    
    return {
    };
  },
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  padding: 350px 0;
  background-color: #C4DFD1;
}
</style>

我不知道还能做什么。任何帮助表示赞赏!

【问题讨论】:

    标签: javascript vue.js vue-cli popper.js


    【解决方案1】:
    import { createPopper } from '@popperjs/core';
    
    export default {
    name: "TestView",
    components: {
    },
    data() {
    return {
    };
    },
    mounted(){
      const button = document.querySelector('#button');
      const tooltip = document.querySelector('#tooltip');
      createPopper(button, tooltip);
    }
    };
    

    你应该使用 refs 而不是 ids(我在这里没有使用它们以避免混淆你),这将确保没有冲突,因为你的应用程序可以有多个具有相同 Id 的元素,例如#button。当使用像 popper js 这样的 UI 库时,总是尝试将他们的代码放在mounted 钩子中,mounted 钩子确保你的目标元素例如#button 在 dom 中

    【讨论】:

    • 谢谢。我使用的是Ids,但它不起作用。我设法弄清楚在createPopper 和其他一些东西中使用refs 并使其以某种方式工作。不过,主题问题只是我没有正确导入它。另外,感谢mounted hook 的提示!我对 VueJS 还是有点陌生​​,所以真的很感激!
    【解决方案2】:

    我认为你应该这样做

    import { createPopper } from '@popperjs/core';
    

    而不是像上面那样,即

    import Popper from "@popperjs/core";
    

    请看这里:module bundlers

    【讨论】:

    • 非常感谢!在这个新版本中似乎没有Popper(开头提到的教程似乎使用了一个过时的教程,它确实存在)。不幸的是,即使使用“模块捆绑器”代码块中的复制/粘贴代码,现在我也会收到一条错误消息 Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element. - 这没有任何意义,但这是一个单独的问题。
    • 你必须有一个你正在应用 popper 的元素,确保你的 js 代码中有一个查询选择器,你指的是一个 DOM 元素,例如一个使用其类或 id 的按钮.在 vuejs 中,确保你有一个 popper 引用的现有组件
    • 谢谢。我使用了正确的 Ids,因为官方教程正在使用它们(这就是为什么它对我没有意义),但我修改了使用组件 refs 和 a其他几件事,并使其以某种方式工作。 :D
    【解决方案3】:

    您必须添加 this.$nextTick 以获取仅在整个视图呈现后才会运行的代码 (https://vuecomponent.com/integrations/popperjs.html)

    import { createPopper } from '@popperjs/core';
          
    export default {
      name: "TestView",
      components: {
      },
      data() {
        return {
        };
      },
      mounted(){
        this.$nextTick(() => {
          const button = document.querySelector('#button');
          const tooltip = document.querySelector('#tooltip');
          createPopper(button, tooltip);
        });
      }
    };
    

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 2018-01-20
      • 2018-05-28
      • 1970-01-01
      • 2018-10-26
      • 2018-05-03
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多