🌞

Dynamic component trong Vue

Sửa bài viết này

Khái niệm dynamic component trong Vue rất đơn giản, nếu :is="true", component đó sẽ được render

<component :is=”currentTab”></component>

Khi chúng ta dùng :is, còn một component khác cũng cần biết là <keep-alive/>, nó cho phép component tạm thời núp lùm chứ không phải diệt cỏ tận gốc, ví dụ trong tab component, khi switch qua switch lại giữa các tab, không cần phải kill nó luôn.

<keep-alive>
<component :is=”currentTab” />
</keep-alive>

Chúng ta nghiền ngẫm xem cách sử dụng 2 đứa này, với một trường hợp khác

Có một cục dữ liệu như thế này, mỗi key là một kiểu dữ liệu khác nhau

const person = {
  firstName: "John",
  lastName: "Doe",
  birthdate: "1986-06-22T00:00:00Z",
  anniversary: "2005-10-09T00:00:00Z",
  activities: ["Skiing", "Hiking", "Cycling", "Drinking Beer"],
  about: "John talking about himself. It goes on and on forever...[snip]",
  metadata: {
    lastUpdateUTC: "2019-06-29T15:14:00Z",
    lastUpdatedBy: "admin"
  }
}

Để hiển thị 1 dữ liệu của key, chúng ta có thể làm như thế này

<li>
  <span class="item-title">Name</span> {{ person.firstName }} {{ person.lastName }}
</li>
<li>
  <span class="item-title">Birthday</span> {{ person.birthday | formatDate }}
</li>
<li>
  <span class="item-title">activities</span> 
  // loop tiếp
</li>

Với từng kiểu dữ liệu khác nhau, chúng ta sẽ cần đến những filter khác nhau, hoặc thậm chí thêm thư viện (như để parse giá trị date). Vấn đề là chúng ta không loop được 1 lần một cho khỏe

Trước tiên chúng ta cần đưa trách nhiệm xử lý, định dạng các kiểu dữ liệu này cho component con, thằng bố chúng ta chỉ việc loop thôi

<li><span class="item-title">First Name</span> <details-text :value="person.firstName + ' ' + person.lastName" /></li>
<li><span class="item-title">Birthday</span> <details-date :value="person.birthday" /></li>
<li><span class="item-title">Activities</span> <details-list :value="person.activities" /></li>

Vẫn chưa loop được, vì các component con này là khác nhau, chúng ta cần có một cách nào đó để đưa điều kiện: “Ê, chọn component này khi dữ liệu là a,b,c,d”

Dynamic component sẽ cho chúng ta làm điều đó!

Trước tiên chúng ta cần transform dữ liệu ban đầu về dạng mảng như sau

 computed: {
    items() {
      return [
        { name: "Name", value: `${this.person.firstName} ${this.person.lastName}`, component: "DetailsText" },
        { name: "Birthday", value: this.person.birthday, component: "DetailsDate" },
        { name: "Activities", value: this.person.activities, component: "DetailsList" },
      ];
    }
  }

Chúng ta đã có thể dùng v-for, chọn đúng component cần dùng

<li v-for="item in items" :key="item.name">
	<span class="item-title">{{item.name}}</span>
	<component :is="item.component" :value="item.value" />
</li>

Cái hay là chỗ chúng ta map :is=”item.component” với component đã khai báo cho từng thằng dữ liệu

The Magic of Vue's Dynamic Components For Lists of Data

Initializing...