Подтвердить что ты не робот

Компоненты VueJS

Я хочу использовать компоненты VueJS для очистки моих скриптов. Поэтому у меня есть компонент для каждой страницы, которую я загружаю в Laravel. Пока все работает нормально. Но у меня проблемы с переносом текущей логики script на компонент.

Это текущая настройка script, импортирующая используемые компоненты:

main.js

import HomeView from './components/HomeView.vue';
import IncidentView from './components/IncidentView.vue';

window.app = new Vue({
   el: '.content',

   components: {
       HomeView, IncidentView
   },

   methods: {

       // Init GIS
      init: function() {

          // Initialize GIS Map
         initGISMap(this.$els.map);
      },
    }
(...)
}

Ключ для меня - это часть window.app = new Vue.... Я использую карты Google, поэтому, когда страница загружается, он ищет метод app.init. Это часть script Я загружаю внутри шаблона клинка:

<!DOCTYPE html>
<html>
<body class="hold-transition skin-blue sidebar-mini">
        <section class="content-header">
            <h1>
                @yield('page_title')
                <small>@yield('page_description')</small>
            </h1>
        </section>

        <!-- Main content -->
        <section class="content">

            @if (isset($vueView))
                <component is="{{ $vueView }}">
            @endif
                @yield('content')
            </component>

        </section>
        <!-- /.content -->
<script src="https://maps.googleapis.com/maps/api/js?key=KEY&libraries=places&callback=app.init" async defer></script>
</body>
</html>

Отдельные страницы (где я создаю для каждого модуля в Vue) выглядят следующим образом:

@extends('app', ['vueView' => 'home-view'])
@section('page_title', 'title')
@section('page_description', 'title')

@section('content')
content
@endsection

Определяя переменную vueView, используется правильный модуль, который я импортирую в моем script.

Цель состоит в том, чтобы использовать компонент HomeView в качестве основного вида карт Google. И другие компоненты для разных страниц загружаются при нажатии соответствующей ссылки в моей теме. В конце я не хочу, чтобы весь код VueJS был в одном script. Поэтому модели.

Когда я переношу весь контент этого текущего JS файла, я получаю сообщение об ошибке, что app.init не является функцией. Компонент выглядит следующим образом:

<script>
export default {
   data: {
       // SEARCH
       addressComponents: '',
       autocompletePlace: '',
       autocompleteAddress: '',
(...)
}

Как мне изменить свой компонент таким образом, что загрузка app.init все равно будет работать?

4b9b3361

Ответ 1

Кто-то уже упомянул GuillaumeLeclerc/vue-google-maps, который доступен на npm как vue-google-maps, но следует предупредить, что эта версия работает только с vue 1.x

Если вы используете v2, посмотрите на эту замечательную вик ​​vue2 xkjyeah/vue-google-maps - она ​​доступна как vue2-google-maps на npm.

API прост и не отклоняется далеко от версии v1, а репозиторий гораздо активнее, чем его аналог upsteam.

Это действительно сделало мою карточку vue намного более безболезненной, чем мой собственный, что я и делал изначально.

Я надеюсь, что это поможет

Ответ 2

Возможно, вам следует использовать или, по крайней мере, изучить код пакета, который делает это.

Например, вы можете проверить vue-google-maps на Github: https://github.com/GuillaumeLeclerc/vue-google-maps/

Он определяет множество компонентов, связанных с Google Maps.

Ответ 3

Если вы правильно поняли, у вас есть Google Maps script, который при загрузке вызывает window.app.init, правильно?

У вашего компонента Vue есть метод init() (ни один не показан выше)? Если бы он был один, ему нужно было бы в app.methods.init() помнить для VueJS, стандартные вызываемые методы живут под ключом методов.

Альтернативно: вы не указываете, является ли ваш app.init частью компонента Vue или нет. Если это не означает, что ваша функция app.init переопределяется, потому что вы переопределяете window.app как ваш компонент vue.

Наконец, если ваш init является частью Vue, ваши карты google fn обращаются к этому init() перед загрузкой Vue и, следовательно, такой метод не существует (пока)?