Vue.js : $attrs доступен только для чтения, $listeners доступен только для чтения

#typescript #vue.js #vuetify.js #npm-link

Вопрос:

Я попытался создать свою собственную библиотеку компонентов, реализующую Vuetify, с помощью vue-cli vue create d-components . Мои компоненты регистрируются с помощью install функции, экспортируемой в основной файл.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 ?

Ответ №1:

Да, причина в дублировании экземпляра Vue, и я думаю, что в вашей консоли должно быть предупреждение об этом.

Причина в том, что ваша ссылка npm выполнена в подмодуле, который устанавливает пакет подмодулей глобально и все его зависимости, включая Vue. Вы можете проверить каталог node_modules вашего глобально установленного подмодуля, вы должны увидеть там Vue.

Таким образом, у вас есть первый Vue в node_modules вашего проекта и второй Vue в node_modules вашего компонента (глобально установленного).

Решение состоит в том, чтобы использовать ссылку npm ../component (не устанавливая npm в директории компонентов) из каталога вашего проекта, либо опубликуйте npm для компонента и установите его как обычную зависимость для вашего проекта. Это не приведет к установке Vue в каталог node_modules вашего компонента.

Комментарии:

1. У меня не было никаких предупреждений в консоли, кроме ошибок, но удаление папки node_modules связанной библиотеки устранило проблему. Я не могу использовать публикацию npm, потому что мой работодатель прямо запрещает это. По крайней мере, теперь я знаю, что происходит, и я знаю, как это исправить, даже если я не могу опубликовать свою библиотеку (хотя удаление node_modules, похоже, работает, это больше похоже на взлом, чем на правильное решение). Спасибо за понимание

Ответ №2:

 $vuetify required package vuetify
 

Комментарии:

1. Каков контекст этого?