Vue.js เริ่มต้น ตอน9 (List Rendering v-for)

11 Jun 2018

Share to:

ในบทความนี้เราจะมาเรียนรู้การวนลูปแสดงข้อมูลในลักษณะ List ซึ่ง Vue ก็มีเครื่องมือมาให้เราใช้งานได้อย่างง่ายดาย ก็คือ v-for มันสามารถใช้งานได้ทั้ง Array และ Object มาดูตัวอย่างแรกกันเลย

v-for กับข้อมูล Array

Template:

<ul id="example-1">
  <li v-for="item in items">
    {{ item.message }}
  </li>
</ul>

Data:

data: {
  items: [
    { message: 'Foo' },
    { message: 'Bar' }
  ]
}

จะได้ผลลัพธ์

Image

ในตัวอย่างเราจะใช้ v-for=“item in items” ลูปแสดงผลข้อมูลที่อยู่ใน items ได้เลย นอกจากนี้เรายังสามารถดึงค่า index ของข้อมูลในแต่ละ item ออกมาได้โดยเขียนตามตัวอย่างนี้ Template:

<ul id="example-2">
  <li v-for="(item, index) in items">
    {{ parentMessage }} - {{ index }} - {{ item.message }}
  </li>
</ul>

Data:

data: {
  parentMessage: 'Parent',
  items: [
    { message: 'Foo' },
    { message: 'Bar' }
  ]
}

ผลลัพธ์

Image

v-for กับข้อมูล Object

v-for สามารถใช่กับ Object ได้ด้วยเหมือนกัน โดยมีรูปแบบการใช้งานดังตัวอย่างนี้ Template:

<ul id="v-for-object" class="demo">
  <li v-for="value in object">
    {{ value }}
  </li>
</ul>

Data:

data: {
  object: {
    firstName: 'John',
    lastName: 'Doe',
    age: 30
  }
}

ผลลัพธ์

Image

และยังสามารถดึงข้อมูลของ Key ในแต่ละ item ออกมาได้อีกด้วย ดังตัวอย่าง

<div v-for="(value, key) in object">
  {{ key }}: {{ value }}
</div>

หรือ Index ของแต่ละ key ก็ยังสามารถดึงออกมาได้ ตามนตัวอย่างนี้

<div v-for="(value, key, index) in object">
  {{ index }}. {{ key }}: {{ value }}
</div>

เรื่องของ Key กับ v-for

เมื่อคุณใช้งาน v-for แล้วเมื่อข้อมูลมีการเปลี่ยนแปลงลําดับใหม่ v-for จะใช้การแทนที่ของข้อมูลแทนการย้าย Dom อาจทําให้ข้อมูลอาจจะแสดงผิดพลาด เช่นข้อมูลแสดงซํ้า สิ่งที่ควรทําคือการกําหนด Key ที่ไม่ซํ้ากัน ให้กับ HTML ในแต่ละ Item เพื่อให้ Vue แยกแยะแต่ละ node ได้ มาดูตัวอย่างการใช้ Key กันครับ

<div v-for="item in items" :key="item.id">
  <!-- content -->
</div>

Array Change Detection

ในกรณีที่ใช้ v-for กับ Array เราจะมาดูกันว่า การเปลี่ยนแปลงใดบ้างที่จะทําให้ v-for Render Component บ้าง

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

v-for จะไม่ Render component ใหม่ในกรณีดังต่อไปนี้

  • แก้ไขข้อมูลในบาง item เช่น items[indexOfItem] = newValue
  • เปลี่ยนขนาดของ Array เช่น items.length = newLength

ตามตัวอย่างนี้

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // is NOT reactive
vm.items.length = 2 // is NOT reactive

แต่เราสามารถทําแบบนี้เพื่อให้ข้อมูลอัพเดทได้

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)

หรือ

// Array.prototype.splice
this.items.splice(indexOfItem, 1, newValue)

หรือ

this.$set(this.items, indexOfItem, newValue)

หรือเปลี่ยนขนาดได้โดย

this.items.splice(newLength)

Object Change Detection Caveats

ในส่วนของ Object Vue จะไม่ Detect ในกรณีที่เราเพิ่ม Key ของ Object เข้าไปตรงๆ ตามตัวอย่างนี้

var vm = new Vue({
  data: {
    a: 1
  }
})
// `vm.a` is now reactive

vm.b = 2
// `vm.b` is NOT reactive

แต่เรายังสามารถเพิ่มได้ด้วยการใช้ set ตามตัวอย่างนี้

var vm = new Vue({
  data: {
    userProfile: {
      name: 'Anika'
    }
  }
})
Vue.set(vm.userProfile, 'age', 27)

หรือ

this.$set(this.userProfile, 'age', 27)

Displaying Filtered/Sorted Results

ในบางครั้งเราต้องการแสดงผลของ List แบบเรียงลําดับ หรือมีการ Filter ข้อมูล แต่ไม่ต้องการเปลี่ยน Original Data เราสามารถใช้ Computed มาช่วยได้ตามตัวอย่างนี้ Template:

<li v-for="n in evenNumbers">{{ n }}</li>

script:

data: {
  numbers: [ 1, 2, 3, 4, 5 ]
},
computed: {
  evenNumbers: function () {
    return this.numbers.filter(function (number) {
      return number % 2 === 0
    })
  }
}

v-for with a Range

เราสามารถกําหนดจํานวนการวนลูปแบบนี้ได้ครับ

<div>
  <span v-for="n in 10">{{ n }} </span>
</div>

ผลลัพธ์

Image

v-for with v-if

ถ้าในบางกรณีที่เราต้องการแสดงแค่บาง item เท่านั้น เราสามารถใส่เงื่อนไขเข้าไปได้เช่น

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>

มาถึงตอนนี้เราสามารถใช้งาน v-for ในรูแปบต่างๆกันไปแล้ว ทั้งในเรื่องของการใช้ v-for กับ Array หรือใช้ กับ Object และเงื่อนไขของการ Update ในแบบต่างๆ หวังว่าเพื่อนๆจะสามารถนําไปประยุกต์ใช้งานได้ไม่ยากครับ

Suggestion blogs

วิธีการโฮสต์ไฟล์ IPFS ให้ออนไลน์ตลอดไป

สวัสดีครับ โดยปกติเมื่อ Add File เข้า IPFS แล้ว IPFS จะทําการ Pin File ให้โดยอัตโนมัติ หมายความว่า File นั้นจะยัง Online อยู่ ใน IPFS Network แต่เมื่อใดเราปิดเครื่อง หรือปิด IPFS Daemon แล้ว File นั้นจะถูกลบออกจาก IPFS Network ในเวลาต่อมา (ประมาณ 24 ชั่วโมง) ดังนั้นถ้าต้องการจะให้ File คงอยู่ตในลอดไป จะต้องให้เครื่องคอมพิวเตอร์ หรือ Node อื่นๆ Pin File ของเราไว้ในระบบด้วย ยิ่งมี Node ที่ Pin File ของเราเยอะ File ของเรานั้นก็จะอยู่ในระบบ ไม่หายไปไหน ถึงแม้ว่าเราปิดเครื่องของเราแล้วก็ตาม

ใช้ Docker Compose กับ Docker Swarm

สวัสดีครับจากบทความตอนที่แล้ว "เริ่มต้นใช้ Docker Swarm" เราได้เรียนรู้พื้นฐานการใช้งาน Docker Swarm กันไปแล้ว ในบทความนี้เราจะมาต่อยอดโดยนํา Docker Compose มาใช้ใน Docker Swarm เพราะในงานจริงเราจะได้ทํางานได้ง่ายและสะดวกขึ้น ก่อนที่จะอ่านบทความนี้ควรจะต้องมีความรู้ในเรื่องของ Docker Swarm และ Docker Compose ก่อน กลับไปอ่านได้ที่นี่

lsof ตรวจสอบการเปิดไฟล์ต่างๆ ใน linux

ถ้าต้องการดูว่า โปรแกรมที่เราสนใจ เปิดใช้งานไฟล์ไหนบ้าง หรือเปิด socket อะไรบ้าง สามารถดูได้ด้วยคําสั่งนี้


Copyright © 2019 - 2024 thiti.dev |  v1.41.0 |  Privacy policy | 

Build with ❤️ and Astro.

Github profile   Linkedin profile   Instagram   X profile   Youtube channel   Telegram   Email contact   วงแหวนเว็บ