2016-05-10 8 views
13

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

Это текущая настройка сценария импорта, которые будут использоваться компоненты:

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. Это часть сценария я ЗАГРУЗКА в шаблоне лезвия:

<!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 переменная, используется правильный модуль, который я импортирую в свой скрипт.

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

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

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

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

ответ

7

Кто-то уже упомянул 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 работать намного более безболезненно, чем катать самостоятельно, что я и делал изначально.

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

1

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

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

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

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

+0

Да. Я импортирую скрипт Google Maps и скажу ему загрузить метод init при загрузке страницы через вызов window.app.init в скрипте. Я добавил метод init(), который не был показан случайно, но существует и прекрасно загружает все, что связано с картой. Все методы живут и работают в ключе метода. Теперь цель состоит в том, чтобы реорганизовать код, и поскольку загружаемая «основная» страница содержит представление карты, я хочу создать компонент, который содержит только все необходимое для этой страницы. Другая страница будет иметь различный контент, и я хочу использовать там разные методы. – sesc360

+0

Приложение не входит в состав компонентов. Они просто выглядят так, как описано на данный момент. Фактически выражение 'window.app = new Vue' дает мне головную боль с точки зрения того, как я правильно использую компоненты, поэтому, когда загружается скрипт Google Maps, он находит правильный метод init. – sesc360

+0

Итак, как бы я это сделал, это настроить карты Google как автономную службу JS, которая вызывается самим Vue, возможно, в его обратном вызове lifecycle created(). Таким образом, вы лучше контролируете координацию. Вам не обязательно это делать, но в противном случае вам нужно будет согласовать время всего, что компонент Vue доступен до того, как будет сделан обратный вызов из карт в vue. Предложите записать примечание на консоль в обратные вызовы жизненного цикла Vue() и ready() и сделать то же самое на картах google, чтобы узнать, готовы ли ваши карты перед vue. –

7

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

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

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