จะทำให้ Vue.js มีเนื้อหาที่เรนเดอร์ฝั่งเซิร์ฟเวอร์จาก CMS ได้อย่างไร

สมมติว่านี่คือสถานการณ์:

  • เนื้อหาได้รับการจัดการผ่าน CMS "คลาสสิก" เช่น WordPress หรือ TYPO3
  • เนื้อหาถูกส่งโดย CMS ในรูปแบบ HTML และ CSS ที่แสดงผลอย่างสมบูรณ์

ในส่วนหน้า Vue.js ควรใช้สำหรับการโต้ตอบทั้งหมดกับ UI


แม้ว่าฉันจะอ่านเอกสารส่วนใหญ่ของ 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 noob ฉันยังคงไม่เห็นคำตอบ สมมติว่าแบ็กเอนด์ของคุณคือ PHP และกำลังสร้าง JSON นี้ ดังนั้น - ใช้ PHP เพื่อพิมพ์ส่วนประกอบ Vue หรือไม่ หรือเรากำลังบอกว่าให้โหลดเพจแล้วใช้ xhr เพื่อทำให้คอมโพเนนต์ Vue ชุ่มชื้น? นั่นจะเป็นคำขอ http สองคำขอแทนที่จะเป็นคำขอเดียวใช่ไหม - person David; 23.02.2021
comment
ตกลง นี่คือความคิดเห็นในความคิดเห็นของฉันเองด้านบน: router.vuejs.org/guide/ ขั้นสูง/data-fetching.html - person David; 23.02.2021