【问题标题】:NuxtJS: Using a vanilla JS library (Pickr) in a page componentNuxtJS:在页面组件中使用 vanilla JS 库 (Pickr)
【发布时间】:2020-05-21 09:52:36
【问题描述】:

我正在尝试在我的 NuxtJS 项目中实现 vanilla JS 库(特别是 Pickr [https://simonwep.github.io/pickr])。

我使用 NPM 安装它:

npm install @simonwep/pickr

在我的 NuxtJS create.vue 页面中,我执行以下操作:

<template>
    <div>
        ..other HTML elements..
        <span class="color-picker"></span>
        ..other HTML elements..
    </div>
</template>

<script>
    import '@simonwep/pickr/dist/themes/classic.min.css';
    import Pickr from '@simonwep/pickr'

    export default {
        mounted() {
            // code below is taken from Github 
            const pickr = Pickr.create({
                el: '.color-picker',
                theme: 'classic', // or 'monolith', or 'nano'

                swatches: [
                    'rgba(244, 67, 54, 1)',
                    'rgba(233, 30, 99, 0.95)',
                    'rgba(156, 39, 176, 0.9)',
                    'rgba(103, 58, 183, 0.85)',
                    'rgba(63, 81, 181, 0.8)',
                    'rgba(33, 150, 243, 0.75)',
                    'rgba(3, 169, 244, 0.7)',
                    'rgba(0, 188, 212, 0.7)',
                    'rgba(0, 150, 136, 0.75)',
                    'rgba(76, 175, 80, 0.8)',
                    'rgba(139, 195, 74, 0.85)',
                    'rgba(205, 220, 57, 0.9)',
                    'rgba(255, 235, 59, 0.95)',
                    'rgba(255, 193, 7, 1)'
                ],

                components: {

                    // Main components
                    preview: true,
                    opacity: true,
                    hue: true,

                    // Input / output Options
                    interaction: {
                        hex: true,
                        rgba: true,
                        hsla: true,
                        hsva: true,
                        cmyk: true,
                        input: true,
                        clear: true,
                        save: true
                    }
                }
            });

        }
    }
</script>

当我导航到导入此插件的页面时,我收到以下错误:

问题一:

我认为这是因为它试图找到尚不存在的&lt;span class="color-picker&gt;&lt;/span&gt;。我认为“安装”是在模板渲染后执行的。我在这里不明白什么?我该如何解决?

问题 2:

有没有合适的方式使用原生 JS 库作为插件?我读了这个https://nuxtjs.org/guide/plugins/,但我不清楚这是哪种情况。显然,这不是一个 Vue 插件,而是一个位于 node_modules 中的 ES6 插件。那么,如果我们想从每个页面访问这个插件,我们该如何解决呢?

问题 3:

当我重新启动服务器(CMD+C,npm run dev [服务器和客户端都编译OK])并访问http://localhost:3000/dashboard/ageRanges/create,库工作正常。

如果我重新加载该页面,我会收到上一个错误。

知道为什么吗?

【问题讨论】:

  • 我尝试用那个包创建一个代码沙箱,但它只是把沙箱弄乱了。但你可以尝试的东西是。 1. 使用$ref 代替el 而不是类,不确定这是否有帮助但需要考虑。 2. 使用全局 mixin,这将允许您在任何地方引用this.Pickr
  • 来自服务器的 Stacktrace 可能会有所帮助。看看什么参考给出了错误。无论如何,当元素已经存在时,确实会调用mounted()。正如上面评论中提到的那样,仅通过类引用并不是一个好主意。我建议使用 $el 来获取组件根目录(最好单独包装pickr来拥有组件,尽管您可以使用 this.$el.querySelector('.color-picker')
  • @farincz 尝试在我的方法中使用 this.$el.querySelector('.color-picker') ,它可以工作,但是当我重新加载页面时,我再次遇到相同的错误(500 referenceError)和“未定义窗口”。我还使用旧语法(不是箭头函数)来确保调用“this”并且仍然是同样的问题。
  • 如果我注释掉导入 pickr css 和 js 文件,并使用 console.log(this.$el.querySelector('.color-picker')) 那么我不会收到错误即使我刷新页面。所以重新加载页面并再次导入css/js时出现问题..这可能吗?

标签: javascript vue.js nuxt.js


【解决方案1】:

似乎 Picker 本身正在访问窗口。所以即使在服务器端模式下导入也会导致错误。

这可以解决,但很棘手。您基本上需要将导入移动到仅在客户端模式下加载的插件。

您可以使用我在以下答案中提出的相同方法 how to add plugins of ckeditor in nuxt with ssr (同样的问题,库正在访问窗口对象)

【讨论】:

  • 所以基本上我用 import Vue from 'vue' 创建了一个 pickr.js 插件;从“@simonwep/pickr”导入 Pickr; Vue.component('pickr', Pickr);然后在 nuxt.config.js 中将其添加到插件 {src: '@/plugins/pickr', mode: 'client'} 中。之后我该如何使用它?
  • @christostsang 注册全局组件,例如 (IN PLUGIN)。然后在你的视图中使用它(这里没有额外的导入)。对于服务器,它只是呈现为未知元素的 uknown 标签。对于客户端,它的标签绑定到您注册的组件,因此 vue 在此处渲染组件。而且您有效地将导入移动到仅在客户端导入的位置。
猜你喜欢
  • 1970-01-01
  • 2020-02-29
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多