Регистрация компонента Vue JS

У меня есть страница JS с экземпляром Vue Js, в которую я импортирую компонент. Однако я получаю следующую ошибку:

Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the "name" option.

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

Компонент:

<template>
  <GoogleMapLoader :mapConfig = "mapConfig" apiKey = "YOUR_API_KEY">
    <template slot-scope = "{ google, map }">
      <GoogleMapMarker
        v-for = "marker in markers"
        :key = "marker.id"
        :marker = "marker"
        :google = "google"
        :map = "map"
      />
      <GoogleMapLine
        v-for = "line in lines"
        :key = "line.id"
        :path.sync = "line.path"
        :google = "google"
        :map = "map"
      />
    </template>
  </GoogleMapLoader>
</template>

<script>
import GoogleMapLoader from "./GoogleMapLoader";
import GoogleMapMarker from "./GoogleMapMarker";
import GoogleMapLine from "./GoogleMapLine";
import { mapSettings } from "./mapSettings";

export default {
  name: "TravelMap",
  components: {
    GoogleMapLoader,
    GoogleMapMarker,
    GoogleMapLine
  },

  data() {
    return {
      markers: [
        { id: "here", position: { lat: 32.800359, lng: -117.021605 } },
        { id: "there", position: { lat: -51.628489, lng: -72.545818 } }
      ],
      lines: [{
        id: "1",
        path: [{ lat: 32.800359, lng: -117.021605 }, { lat: -51.628489, lng: -72.545818 }]
      }]
    };
  },

  computed: {
    mapConfig() {
      return {
        ...mapSettings,
        center: this.mapCenter
      };
    },

    mapCenter() {
      return this.markers[1].position;
    }
  }
};
</script>

import Vue from "vue";

Vue.config.productionTip = false;

import TravelMap from "./TravelMap";

new Vue({
  el: "#App",
  components: { TravelMap }
});

Вот также ссылка на песочницу со всем примером кода: https://codesandbox.io/s/yqqwwz0z1x

возможный дубликат Неизвестный пользовательский элемент Vue.js

geocodezip 05.04.2019 01:13

Не тот ответ. Я импортирую компонент перед экземпляром vue, и у меня есть раздел компонентов внутри инициализации Vue.

McWayWeb 05.04.2019 01:26
<travel-map class = "travel-map"/> В HTML нельзя использовать заглавные слова, вместо них следует использовать kebab Case. Также переименуйте свои компоненты Google, это должно быть <google-map-loader> и так далее.
bcjohn 05.04.2019 07:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
324
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как указано в одном из комментариев, в HTML не допускаются заглавные слова.

Первым вариантом будет просто изменить тег TravelMap в index.html на <travel-map class = "travel-map" />.

Другой вариант — изменить создание экземпляра Vue.

Если вы измените содержимое тела из файла index.html на

<body> <div id = "app" /> <!-- built files will be auto injected --> </body>

и создайте свой экземпляр Vue вот так

new Vue({ el: "#app", template: "<App/>", components: { App } });

App.vue будет записью вашего приложения, и внутри шаблона приложения вы сможете использовать то же имя, которое использовалось для импорта/регистрации компонента.

Ссылка на обновленную песочницу: https://codesandbox.io/s/50vo260nqp

Я понимаю, что теги HTML в верхнем регистре не допускаются, однако их использование в верхнем регистре не влияет на работу файла. В вашей обновленной песочнице, которая работает, она по-прежнему работает с прописными буквами. Я также понимаю, что добавление app.vue в качестве точки входа, как вы это сделали, заставит его работать, однако весь смысл этой проблемы заключался в том, чтобы упростить пример и заставить его работать без включения дополнительного файла.

McWayWeb 05.04.2019 19:35

@McWayWeb Изменение записи вашего приложения на компонент app.vue означает, что у вас нет таких проблем. Есть разница между файлом index.html и тегом <template> в компонентах. Вы не можете ссылаться на свой компонент, используя имя в верхнем регистре. Вы должны использовать чехол для кебаба. В части шаблона ваших компонентов вы можете использовать то же имя, которое вы использовали для регистрации компонента, например. TravelMap

afroeber 06.04.2019 20:41
Ответ принят как подходящий

В итоге я изменил его, чтобы вместо этого загружать компонент с помощью Ларавель:

Vue.component('google-map', require('../GoogleMaps/GoogleMap').default);

new Vue({
  el: "#App"
});

Другие вопросы по теме