【问题标题】:Vue.js : $attrs is readonly, $listeners is readonlyVue.js:$attrs 是只读的,$listeners 是只读的
【发布时间】:2021-07-26 15:54:02
【问题描述】:

我尝试使用 vue-cli vue create d-components 构建自己的实现 Vuetify 的组件库。我的组件是通过在我的 lib 的 main.ts 文件中导出的 install 函数注册的,例如:

import Vue, { VueConstructor } from 'vue';
import Vuetify from 'vuetify';
import DBtn from "./components/DBtn.vue";

Vue.use(Vuetify)

export default {
  install(vue: VueConstructor): void {
    vue.component("d-btn", DBtn);
    ...
  }
}

而一个组件定义为:

<template>
  <v-btn v-bind="$attrs" v-on="$listeners" elevation="0" small>
    ...
  </v-btn>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";

@Component({})
export default class DBtn extends Vue {}
</script>

我将此库作为 git 子模块添加到我的主 Vue.js 应用程序(也使用 Vuetify)中,在子模块的根文件夹中运行 npm installnpm link,然后在我的主应用程序文件夹中运行 npm link d-components .

我的应用程序正在通过以下方式导入和调用我的库的安装函数:

import Vue from 'vue';
import DComponents from "d-components" // library's name

Vue.use(DComponents);

目前看来一切正常。

但是当我尝试使用我的库的组件时,我得到了一堆错误:

[Vue warn]: $attrs is readonly.

[Vue warn]: $listeners is readonly.

这似乎是因为在我的应用程序中创建了两个 Vue 实例,我搜索了我的所有 Vue 导入是否相同,我只能在我的主应用程序中找到 import Vue from 'vue' 和我的图书馆。

有谁知道如何检查我是否创建了多个 Vue 实例?

【问题讨论】:

    标签: typescript vue.js vuetify.js npm-link


    【解决方案1】:

    是的,原因是重复的 Vue 实例,我认为您的控制台中应该有关于此的警告。

    原因是您的 npm 链接 在 submodule 中完成 - 它全局安装 submobule 包及其所有依赖项,包括 Vue。您可以查看全局安装的子模块的 node_modules 目录,您应该在那里看到 Vue。

    因此,您在项目的 node_modules 中有第一个 Vue,在组件的 node_modules 中有第二个 Vue(全局安装)。

    解决方案是使用项目目录中的 npm link ../component(不在组件目录中执行 npm install)或者为组件执行 npm publish 并安装它作为您项目的常规依赖项。这不会导致将 Vue 安装到组件的 node_modules 目录中。

    【讨论】:

    • 我在控制台中除了错误之外没有任何警告,但删除链接库的 node_modules 文件夹解决了这个问题。我不能使用 npm publish,因为我的雇主明确禁止这样做。至少现在我知道发生了什么并且我知道如何修复它,即使我无法发布我的库(虽然删除 node_modules 似乎有效,但感觉更像是一种黑客行为而不是正确的解决方案)。感谢您的洞察力
    【解决方案2】:
    $vuetify required package vuetify
    

    【讨论】:

    • 这是什么上下文?
    猜你喜欢
    • 2019-02-12
    • 2019-04-11
    • 2018-09-10
    • 2021-11-17
    • 2018-09-30
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多