Vue3/Инерция Не удалось разрешить компонент

#vue.js #vuejs3 #inertiajs

Вопрос:

У меня есть приложение, построенное с использованием стека VILT (Vue, Инерция, Laravel, Попутный ветер). У меня есть некоторые компоненты, подобные cards тем, которые можно использовать везде в приложении. Потому что я не хочу вручную импортировать эти компоненты каждый раз, когда я создаю функцию, которая регистрирует компоненты в определенных каталогах:

 /**
 * Register components from the ./components and ./components/core
 * directories. This way these components don't have to be imported
 * manually every time.
 *
 * @param {Vue instance} app
 */
function registerGlobalComponents (app) {
  const requireComponent = require.context(
    './components' || './components/core',
    true,
    /.vue$/
  );

  for (const file of requireComponent.keys()) {
    const componentConfig = requireComponent(file);
    const name = file
      .replace(/index.js/, '')
      .replace(/^.//, '')
      .replace(/.w $/, '');
    const componentName = upperFirst(camelCase(name));

    app.component(componentName,
      componentConfig.default || componentConfig);
  }
}
 

Создание приложения inertion происходит в том же файле:

 /**
 * Create an Inertia app instance.
 */
createInertiaApp({
  resolve: (name) => import(`./Pages/${name}`),
  setup ({ el, app, props, plugin }) {
    const vueApp = createApp({ render: () => h(app, props) });

    /**
     * Mixin for showing notifications.
     */
    vueApp.mixin({
      data: function () {
        return {};
      },
      computed: {
        pageNotifications () {
          return this.$page.props.notification;
        }
      }
    });

    vueApp.use(plugin).mount(el);
    registerGlobalComponents(vueApp);
  }
});
 

Поскольку мой card компонент находится в /components/core каталоге, я должен вызвать компонент в template теге следующим образом: <core-card> content </core-card> . Теперь моя карточка отлично отображается на странице, как вы можете видеть на изображении. введите описание изображения здесь

Но почему-то я получаю следующую ошибку:

[Предупреждение Vue]: Не удалось разрешить компонент: основная карта

Я получаю это предупреждение для всех других моих компонентов, зарегистрированных с помощью этой registerGlobalComponents() функции. Почему я получаю это предупреждение, когда мои компоненты отображаются правильно и работают нормально?

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

1. К вашему сведению, кто — то делает это вручную здесь, используя только инструкции импорта: Зарегистрируйте компонент vue глобально на экземпляре inertion/vue -ваша общая реализация может работать, но дает ли статический подход то же самое сообщение?

Ответ №1:

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

Ранее я импортировал компоненты таким образом:

     createInertiaApp({
      resolve: (name) => import(`./Pages/${name}`),
      setup ({ el, app, props, plugin }) {
        const vueApp = createApp({ render: () => h(app, props) });
    
        /**
         * Mixin for showing notifications.
         */
        vueApp.mixin({
          data: function () {
            return {};
          },
          computed: {
            pageNotifications () {
              return this.$page.props.notification;
            }
          }
        });
    
        vueApp.use(plugin).mount(el);
        registerGlobalComponents(vueApp);
      }
    });

 

И изменил порядок звонков plugin , registerGlobalComponents а также mount приложение, подобное этому:

 vueApp.use(plugin);
registerGlobalComponents(vueApp);
vueApp.mount(el);
 

Я смог решить эту проблему благодаря Роберту с официального сайта Discord. Если он захочет претендовать на награду, я обязательно присужу ему очки.