Как насытить Vue.js содержимым, отображаемым на стороне сервера из CMS?

Допустим, такая ситуация:

  • контент управляется с помощью «классической» CMS, такой как WordPress или TYPO3.
  • контент доставляется CMS как полностью обработанный HTML и CSS

Во внешнем интерфейсе для всех взаимодействий с пользовательским интерфейсом следует использовать Vue.js.


Хотя я прочитал большую часть документации vue, а также страницу Vue.js Server-Side Rendering Guide как а также Использование в средах, отличных от Node.js, я все еще не уверен, как заставить эту работу.


Пример *

На странице есть компонент, который по сути представляет собой список продуктов. Для всех с JavaScript этот список получает фильтр вверху.

Теперь из CMS я получаю полный отрисованный список, например:

<div class="product-component">
    <ul class="products">
        <li data-id="1">Product 1</li>
        <li data-id="2">Product 2</li>
        <li data-id="3">Product 3</li>
    </ul>
</div>

После запуска JavaScript он должен выглядеть так:

<div id="product-component">
    <form>
        <select>
            <option value="1">Show Product 1 only</option>
        </select   
    </form>

    <ul class="products"></ul>
</div>

Компонент в Vue.js может быть примерно таким:

<div id="product-component">
    <form>
        <!-- Vue.js logic for the filter -->
    </form>

    <ul class="products">
        <li v-for="product in products">
            {{ product.name }}
        </li>
    </ul>
</div>


var vm = new Vue({
  el: '#product-component',
  data: {
    products: [
        {id: 1, name: 'Product 1'},
        {id: 2, name: 'Product 2'},
        {id: 3, name: 'Product 3'},
    ],
    filterCurrent: null,
  }
});

Теперь мои вопросы:

  • Как подключить Vue.js к предварительно отрендеренному шаблону?
  • How to update/inject Vue.js variables (especially data) on runtime?
    • Which means: How can I get the list of products from the CMS into the component?
  • Поскольку список и части шаблона уже отрисованы, должен ли Vue.js повторно визуализировать его после инициализации?
  • Как это представлено в жизненном цикле Vue.js?

И последнее, но не менее важное: Возможно ли это настроить?


* Код представляет собой псевдокод, иллюстрирующий проблему.


person lampshade    schedule 16.10.2017    source источник
comment
Я не понимаю, зачем вам использовать предварительно обработанный код. На самом деле это не концепция Vue. Большинство крупномасштабных фреймворков, таких как Wordpress, имеют API для сбора данных за вас. Таким образом, вы можете просто преобразовать эти данные в JSON и передать их своим компонентам. Даже если вы можете подключиться к предварительно отрисованному коду, вы делаете в два раза больше работы.   -  person Stephan-v    schedule 16.10.2017
comment
@ Stephan-v Хм, я не думаю, что например В TYPO3 есть API для такого случая использования. Также было бы невозможно прогрессивное улучшение, не так ли? Есть ли другой метод, с помощью которого я могу подключить рендеринг Vue на стороне сервера на сервере? Или я застрял на jQuery как на единственном фреймворке, который я мог бы использовать?   -  person lampshade    schedule 16.10.2017
comment
Привет, вы когда-нибудь находили хорошее решение для своего вопроса?   -  person Matthias    schedule 14.05.2018
comment
Также см. Здесь аналогичный (но не идентичный) вариант использования: stackoverflow.com/questions/61043632/   -  person Mario    schedule 05.04.2020


Ответы (1)


Пока вы используете собственное расширение, нет проблем с отображением данных через JSON. Vue.js может их получить и взять на себя рендеринг внешнего интерфейса.

person Stefan Padberg    schedule 17.09.2018
comment
Это старый тред, но, будучи новичком в Vue, я до сих пор не вижу ответа. Допустим, ваш бэкэнд - это PHP, и он генерирует этот JSON. Итак - использовать PHP для печати компонентов Vue? Или мы говорим: загрузите страницу, а затем используйте xhr для гидратации компонентов Vue? Это было бы два HTTP-запроса вместо одного, не так ли. - person David; 23.02.2021
comment
Хорошо, вот комментарий к моему собственному комментарию выше: router.vuejs.org/guide/ advanced / data-fetching.html - person David; 23.02.2021