Bagaimana cara menghidrasi Vue.js dengan konten yang dirender di sisi server dari CMS?

Katakanlah, inilah situasinya:

  • konten dikelola melalui CMS "klasik" seperti WordPress atau TYPO3
  • konten dikirimkan oleh CMS sebagai HTML dan CSS yang dirender sepenuhnya

Di Frontend Vue.js harus digunakan untuk semua interaksi dengan UI.


Meskipun saya membaca sebagian besar dokumentasi vue dan juga halaman Panduan Rendering Sisi Server Vue.js sebagai serta Penggunaan di Lingkungan non-Node.js, saya masih belum yakin bagaimana membuat ini berhasil.


Contoh*

Halaman tersebut memiliki komponen yang pada dasarnya adalah daftar produk. Untuk semua orang yang menggunakan JavaScript, daftar ini memiliki filter di bagian atas.

Sekarang, dari CMS saya mendapatkan daftar lengkap yang dirender, seperti:

<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>

Setelah JavaScript dijalankan, tampilannya akan seperti ini:

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

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

Komponen di Vue.js bisa seperti ini:

<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,
  }
});

Sekarang pertanyaan saya adalah:

  • Bagaimana cara menghubungkan Vue.js ke Templat yang sudah dipra-render?
  • 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?
  • Karena daftar dan bagian-bagian templat sudah dirender, haruskah Vue.js merender ulang setelah inisialisasi?
  • Bagaimana hal ini direpresentasikan dalam Siklus Hidup Vue.js?

Yang terakhir: Apakah penyiapan ini mungkin dilakukan?


* Kode ini hanyalah kodesemu untuk menggambarkan masalahnya.


person lampshade    schedule 16.10.2017    source sumber
comment
Saya tidak mengerti mengapa Anda menghubungkan ke kode yang sudah dirender sebelumnya. Ini sebenarnya bukan konsep Vue. Mayoritas kerangka kerja berskala besar seperti Wordpress memiliki API untuk mengumpulkan data untuk Anda. Dengan cara ini Anda cukup memasukkan data ini ke JSON dan memasukkannya ke komponen Anda. Bahkan jika Anda dapat menghubungkan ke kode yang telah dirender sebelumnya, Anda melakukan pekerjaan dua kali lebih banyak.   -  person Stephan-v    schedule 16.10.2017
comment
@ Stephan-v Hm, menurut saya tidak demikian, mis. TYPO3 memiliki API untuk kasus penggunaan seperti itu. Peningkatan progresif juga tidak mungkin dilakukan, bukan? Apakah ada metode lain, di mana saya dapat menghubungkan rendering Vue sisi server di server? Atau apakah saya terjebak dengan jQuery sebagai satu-satunya kerangka kerja yang dapat saya gunakan?   -  person lampshade    schedule 16.10.2017
comment
Hai, apakah Anda pernah menemukan solusi yang baik untuk pertanyaan Anda?   -  person Matthias    schedule 14.05.2018
comment
Silakan lihat juga di sini untuk kasus penggunaan serupa (namun tidak identik): stackoverflow.com/questions/61043632/   -  person Mario    schedule 05.04.2020


Jawaban (1)


Selama Anda menggunakan ekstensi Anda sendiri, tidak ada masalah untuk merender data melalui JSON. Vue.js dapat mengambilnya dan mengambil alih rendering frontend.

person Stefan Padberg    schedule 17.09.2018
comment
Ini adalah utas lama tetapi sebagai pemula Vue saya masih belum melihat jawabannya. Katakanlah backend Anda adalah PHP dan menghasilkan JSON ini. Jadi -- gunakan PHP untuk mencetak komponen Vue? Atau maksudnya, muat halaman lalu gunakan xhr untuk menghidrasi komponen Vue? Itu akan menjadi dua permintaan http, bukan satu, bukan. - person David; 23.02.2021
comment
Oke, inilah komentar saya sendiri di atas: router.vuejs.org/guide/ lanjutan/pengambilan data.html - person David; 23.02.2021