Vue используется для создания полноценных веб-приложений SPA, но может использоваться только в качестве дополнительного компонента без процесса сборки для более простых случаев использования. Обычно вы интегрируете Vue Router для создания многостраничного интерфейса, но вы также можете просто определить отдельные компоненты и смонтировать их на элементе. В вашем случае, со смешиванием PHP и Vue, я бы посоветовал пойти по пути без процесса сборки и добавляемых компонентов.
Vue - это структура JavaScript с stati c шаблонов. Таким образом, вам не следует генерировать шаблоны Dynami c и затем передавать их в Vue, а лучше определять шаблоны stati c, а затем передавать только данные в Vue. Вы можете, например, получить данные через Ajax в формате JSON, а затем обработать эти данные, например, чтобы отобразить список комментариев.
Если вы go для использования Vue в качестве вставки без маршрутизации вам необходимо смонтировать два отдельных экземпляра Vue на соответствующих страницах. Конечно, вы можете повторно использовать части этих компонентов. Имейте в виду, что вы не можете обмениваться данными между этими экземплярами (одно из преимуществ использования SPA). Однако вы можете поделиться данными через LocalStorage / SessionStorage / IndexedDB.
Один из распространенных способов доступа к данным - через REST API (через Ajax / fetch). Вы должны предоставить данные в правильном формате (обычно JSON) за интерфейсом HTTP REST. Затем Vue извлекает данные (см. Также ax ios для упрощения выборки данных) и затем использует их для создания компонентов. Другой подход (менее приятный) - просто визуализировать данные с помощью вашего серверного языка программирования и поместить их в переменную JavaScript, чтобы у вас был доступ к данным во время выполнения.
Вот basi c пример. Имейте в виду, что привязка значения из свойства является анти-шаблоном, и поэтому я не привязывал текст комментария двусторонним способом. Я также жестко запрограммировал данные комментария и не извлекаю их с пульта.
Vue.config.devtools = false;
Vue.config.productionTip = false;
Vue.component('comment', {
data () {
return {
commentAsInput: false
};
},
props: {
commentObject: {
type: Object,
required: true
}
},
template: `<div>
<a href="#" @click="commentAsInput = !commentAsInput" v-if="!commentAsInput">
{{ commentObject.text }}
</a>
<textarea :value="commentObject.text" v-if="commentAsInput" />
</div>`
});
Vue.component('comments', {
data () {
return {
comments: [{ id: 124, text: 'fkgnsdklgnl' }, { id: 2135325, text: 'nlekng345gn' }]
}
},
template: `<div>
<h1>Comments</h1>
<div v-for="comment in comments" :key="comment.id">
<comment :comment-object="comment" />
</div>
</div>`
});
new Vue({
el: '#app',
template: `<comments />`
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app"></div>