typescript - Vue.js:$attrs 是只读的,$listeners 是只读的
问题描述
我尝试使用 vue-cli 构建自己的实现 Vuetify 的组件库vue create d-components
。我的组件是通过install
在我的 lib 的 main.ts 文件中导出的函数注册的,例如:
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 install
在npm 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 实例?
解决方案
是的,原因是重复的 Vue 实例,我认为您的控制台中应该有关于此的警告。
原因是您的npm 链接在子模块中完成 - 它全局安装 submobule 包及其所有依赖项,包括 Vue.js。您可以检查全局安装的子模块的 node_modules 目录,您应该在那里看到 Vue。
因此,您在项目的 node_modules 中有第一个 Vue,在组件的 node_modules 中有第二个 Vue(全局安装)。
解决方案是使用项目目录中的npm link ../component(不在组件目录中执行 npm install),或者为组件执行npm publish并将其安装为项目的常规依赖项。这不会导致将 Vue 安装到组件的 node_modules 目录中。
推荐阅读
- javascript - 如何在 JavaScript 中计算农历新年的日期?
- javascript - 在 jsTree 的上下文菜单中创建功能不起作用
- javascript - 将 js 对象转换为分层 JSON 结构
- regex - 从出现在特定单词之后的字符串中提取值
- c# - c sharp 类型模式导致编译器错误
- python - Python中的极坐标绘图(没有原点的圆弧)
- python - python - 惩罚游戏如何加速元素
- mysql - Prem MySQL 和 Azure 数据存储之间的数据同步
- android - 将最大视图的左侧与约束布局对齐
- python - Jupyter Notebook 将目录/文件路径添加到 Windows 环境变量