#javascript #angularjs #vue.js #vuejs2
#javascript #angularjs #vue.js #vuejs2
Вопрос:
Я конвертирую проект AngularJS в Vue 2.
Моя стратегия заключается в том, чтобы AngularJS обрабатывал маршрутизацию и медленно менял отдельные компоненты в каждом угловом представлении.
В моем main.ts
файле я импортирую и определяю глобальные компоненты следующим образом:
import LoginForm from './components/LoginForm.vue';
Vue.component('LoginForm', LoginForm);
Когда загрузится соответствующий контроллер Angular, я хотел бы запустить некоторый javascript, чтобы вручную смонтировать компонент Vue.
Это хороший подход?
Как я могу вручную смонтировать ранее зарегистрированный компонент?
Vue.somehowGetComponent('LoginForm').mountTo('#login-form');
Ответ №1:
Я бы не стал регистрировать его как глобальный компонент для этой цели. Просто импортируйте его, затем создайте его экземпляр и смонтируйте. например.
// import the component
import LoginForm from './components/LoginForm.vue';
// If you haven't already, must call `Vue.extend` on LoginForm before its instantiation
const myLoginForm = new LoginForm();
// mount to your legacy app
myLoginForm.$mountTo(document.getElementById('login-form'));
Комментарии:
1. Спасибо за отзыв! Как я могу
import
использовать его в своем устаревшем коде, если он не конвертирован / транспилирован в babel, как остальная часть приложения Vue?2. Я бы использовал глобальную переменную в области окна. Не самый приятный, но вы, по сути, делаете это с помощью своего глобально зарегистрированного решения Vue component. Если вы поместите его в какой-то объект window.VUES_LEGACY_ANGULAR.LoginForm, его будет немного проще искать, если вам когда-нибудь понадобится рефакторинг.
3.Я не могу запустить
new LoginForm()
. Есть идеи, почему? все остальное совпадает с вашим примером (import LoginForm from './components/LoginForm.vue';
Uncaught TypeError: window.VueComponents.LoginForm is not a constructor
4. Похоже, вы разобрались. Обычно я использую Vue.extend при определении перед экспортом. Также рекомендовал бы, чтобы любые глобальные окна хранились в объекте контейнера, небольшая вещь, но облегчает их отслеживание. Однако главное, что вы заставили его работать!
5. Да, спасибо за вашу помощь! Сэкономил мне много времени. Я дам вам чек за то, что вы указали мне правильное направление!
Ответ №2:
Ключевым моментом здесь был вызов Vue.extend
моего импортированного компонента:
В Vue.js:
// main.ts
import LoginForm from './components/LoginForm.vue';
window.LoginForm = Vue.extend(LoginForm)
Затем в контроллере AngularJS:
angular.module('app').controller(function(){
var vue = new window.LoginForm();
vue.$mount('#login-form');
});