Один опытный друг-разработчик недавно сказал мне, что Vue.js становится все более популярным в его консалтинговой фирме по программному обеспечению. Поэтому, когда мне понадобилась альтернатива Angular в моем последнем проекте, специальный трекер «ошибок и проблем», я решил разобраться, из-за чего был весь этот шум!
Создание моего первого приложения Vue
Документация Начало работы на vuejs.org »хорошо написана и проста в использовании. Конечно, я сделал свою долю ошибок новичка, которые я здесь задокументирую.
Моя цель - динамически отображать список ошибок и проблем, заполняя каждую строку одним элементом из массива [issues]
.
Вот где я буду создавать свое приложение Vue (issues.js
):
var issuesApp = new Vue({ el: '#issues-container', data: { foo: 'bar' } })
И вот где я беру соответствующие скрипты в issues.html
:
<script type="text/javascript" src="vue/dist/vue.min.js"></script> <script type="text/javascript" src="issues.js"></script>
Попался
Не могу найти элемент
Если вы попытаетесь загрузить оба приведенных выше сценария в <head>
документа, вы получите эту неприятную ошибку:
[email protected]:485 [Vue warn]: Cannot find element: #issues-container
Перемещение тега скрипта, который ссылается на vue.min.js
, в нижнюю часть страницы (непосредственно перед закрывающим тегом body
) не помогло.
Что сработало, так это добавление атрибута defer
в файл, в котором я вызвал new Vue()
.
<script type="text/javascript" src="issues.js"></script>
Я не уверен, что это идеальное решение, но оно помогло мне быстро запустить и запустить мое первое приложение.
Получение полезных отзывов в консоли
Я нашел этот полезный лакомый кусочек в документации к расширению Chrome vue-devtools:
Если на странице используется производственная / миниатюрная сборка Vue.js, проверка инструментов разработчика отключена по умолчанию, поэтому панель Vue не отображается.
Я перешел на неминифицированную версию vue.js
, которая поставляется с модулем узла Vue, и, прежде всего, я могу просматривать больше предупреждений, полезных для новичка.
[Vue warn]: v-bind without argument expects an Object or Array value (found in <Anonymous>)
Это предупреждение заставило меня понять, что это неправильное использование v-bind
:
Foo is <span v-bind="foo"></span> <!-- don't do this! -->
Оказывается, фигурные скобки работают нормально:
<div>Foo is {{foo}}</div>
Советы новичкам в консоли
Боковое примечание: мне нравятся советы, которые разработчики Vue предоставляют в консоли:
Почему не все библиотеки это делают?!? (Пссш… Угловой, я смотрю на тебя! 😉)
Устаревшие хуки жизненного цикла
Я на собственном опыте выяснил, что некоторые хуки жизненного цикла, упомянутые в старых руководствах, существовали в предыдущих версиях Vue, но были объявлены устаревшими в Vue 2.0. Например, ready()
больше не доступен, но альтернативы mounted()
или created()
, в зависимости от того, когда вы хотите, чтобы функция запускалась:
var issuesApp = new Vue({ el: '#issues-container', ready: function() { // this won't work this.loadIssues(); }, created: function() { // but this will this.loadIssues(); }, })
Vue.component головные боли
Я попытался создать свой первый компонент следующим образом:
issues.js:
Vue.component('issueitem', { template: '<div>Hi!</div>' })
issues.html:
<issueitem></issueitem>
Но я получил следующую ошибку:
Unknown custom element <issueitem>. Did you register the component correctly?
Что ж, Vue, если бы я знал, как правильно зарегистрировать компонент, мы бы не вели этот разговор, не так ли ??? 😄
Оказывается, помимо вызова Vue.component
вам нужно добавить ключ components
при вызове new Vue()
.
var _issueitem = Vue.component('issueitem', { template: '<div>Hi!</div>' }); var issuesApp = new Vue({ el: '#issues-container', data: { foo: 'bar' }, components: { issueitem: _issueItem } });
Указание внешнего файла шаблона в компоненте
templateUrl
, с которым я был знаком по Angular, не существует во Vue.
Vue.component('issue', { templateUrl: 'views/issue.html' // don't do this! })
В качестве временной меры я поместил разметку своего шаблона прямо в .component
, заключив в него одиночные обратные кавычки:
var _issueitem = Vue.component('issueitem', { template: ` <div class="issue-row" id="{{issue.id}}"> <div class="issue-col">Site: {{issue.site}}</div> <div class="issue-col">Issue: {{issue.issue}}</div> <div class="issue-col">Page:{{issue.page}}</div> <div class="issue-col">Browser:{{issue.browser}}</div> <div class="issue-col">Severity: {{issue.severity}}</div> <div class="issue-col"># Affected Users: {{issue.users}}</div> <div class="issue-col">Status: {{issue.status}}</div> </div> ` });
Выкладывать большой кусок HTML в середине функции JavaScript немного неудобно, но моя цель - быстро запустить и запустить это приложение [знаменитые последние слова!], Так что пока я оставлю все как есть.
Определение объема
Переменные, определенные на уровне приложения, не доступны напрямую внутри компонентов.
var _issueitem = Vue.component('issueitem', { template: '<div>Foo is {{foo}}<div>' // foo is undefined }); var issuesApp = new Vue({ el: '#issues-container', data: { foo: 'baz' }, components: { issueitem: _issueitem } });
Однако, если вы определите переменную внутри компонента, она будет доступна для шаблона компонента:
var _issueitem = Vue.component('issueitem', { data: function() { return { foo: 'bar' } }, template: '<div>Foo is {{foo}}</div>' ); var issuesApp = new Vue({ el: '#issues-container', components: { issueitem: _issueitem } });
(Теперь это кажется очевидным - ага!)
В итоге
Если вы знакомы с другим фреймворком, таким как Angular, Vue.js не покажется полностью чуждым. Как и во многих проектах с открытым исходным кодом, в документации для начинающих есть несколько дыр, но, немного покопавшись, можно было создать мое первое интерфейсное приложение Vue всего за несколько часов.
Я надеюсь, что этот список ошибок поможет другим новичкам!
Примечание об источниках: большое спасибо Райану Ченки, автору Создайте приложение с Vue.js, Джошуа Бемендерферу, автору Понимания крючков жизненного цикла Vue.js, и многие участники StackOverflow уже задавали вопросы, похожие на мои, и ответили на них!