Now.js Framework Documentation
data-if
data-if
ภาพรวม
data-if แสดงผล elements ตามเงื่อนไข Elements จะถูกลบออกจาก DOM ทั้งหมดเมื่อเงื่อนไขเป็น false
ใช้เมื่อ:
- แสดง/ซ่อนเนื้อหาตามสถานะข้อมูล
- แสดง components แบบมีเงื่อนไข
- สลับส่วนต่างๆ ตามสิทธิ์ผู้ใช้
ทำไมต้องใช้:
- ✅ ลบออกจาก DOM ทั้งหมด (ไม่ใช่แค่ซ่อน)
- ✅ รองรับ expressions ซับซ้อน
- ✅ รองรับ animation สำหรับ transitions
- ✅ Cleanup nested directives อัตโนมัติ
การใช้งานพื้นฐาน
เงื่อนไขอย่างง่าย
<div data-if="isLoggedIn">
ยินดีต้อนรับกลับมา!
</div>กับข้อมูล:
{ isLoggedIn: true }ผลลัพธ์เมื่อ true:
<div>ยินดีต้อนรับกลับมา!</div>ผลลัพธ์เมื่อ false:
<!-- Element ถูกลบออกจาก DOM -->Syntax
<element data-if="expression">| ส่วน | คำอธิบาย |
|---|---|
expression |
JavaScript expression ที่ประเมินเป็น truthy/falsy |
ฟีเจอร์
1. เงื่อนไข Boolean
<div data-if="isVisible">เนื้อหาที่มองเห็น</div>
<div data-if="!isHidden">เนื้อหาที่ไม่ซ่อน</div>2. การมีอยู่ของ Property
<div data-if="user.avatar">
<img data-attr="src:user.avatar">
</div>3. Comparison Operators
<div data-if="count > 0">คุณมีรายการ</div>
<div data-if="status === 'active'">สถานะ active</div>
<div data-if="items.length >= 5">มีหลายรายการ</div>4. Logical Operators
<div data-if="isLoggedIn && isAdmin">แผงควบคุมแอดมิน</div>
<div data-if="hasError || isLoading">แสดงข้อความ</div>
<div data-if="!isDisabled">เนื้อหาที่เปิดใช้งาน</div>5. Expressions ซับซ้อน
<div data-if="user.role === 'admin' && permissions.includes('edit')">
ปุ่มแก้ไข
</div>6. การปฏิเสธ (Negation)
<div data-if="!isLoggedIn">
<a href="/login">กรุณาเข้าสู่ระบบ</a>
</div>รูปแบบ If-Else
เนื่องจากไม่มี data-else ให้ใช้เงื่อนไขปฏิเสธ:
<div data-if="isLoggedIn">
<p>ยินดีต้อนรับ <span data-text="user.name"></span>!</p>
</div>
<div data-if="!isLoggedIn">
<a href="/login">เข้าสู่ระบบ</a>
</div>หลายเงื่อนไข (รูปแบบ else-if)
<div data-if="status === 'loading'">
<div class="spinner">กำลังโหลด...</div>
</div>
<div data-if="status === 'error'">
<div class="error">เกิดข้อผิดพลาด</div>
</div>
<div data-if="status === 'success'">
<div class="content" data-text="data"></div>
</div>การรองรับ Animation
เพิ่ม class animated สำหรับ enter/exit animations:
<div data-if="showModal" class="modal animated">
<div class="modal-content">
เนื้อหา Modal
</div>
</div>CSS:
.modal.animated {
animation: fadeIn 0.3s ease;
}
.modal.fade-out {
animation: fadeOut 0.3s ease;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}เมื่อมี class animated:
- แสดง: เพิ่ม
fade-in,animate-inclasses - ซ่อน: เพิ่ม
fade-out,animate-outclasses, รอ animation
ตัวอย่างขั้นสูง
การยืนยันตัวตนผู้ใช้
<header>
<div data-if="user.isLoggedIn" class="user-menu">
<img data-attr="src:user.avatar" class="avatar">
<span data-text="user.name"></span>
<button data-on="click:logout">ออกจากระบบ</button>
</div>
<div data-if="!user.isLoggedIn">
<a href="/login">เข้าสู่ระบบ</a>
<a href="/register">สมัครสมาชิก</a>
</div>
</header>UI ตามสิทธิ์
<div class="actions">
<button data-if="permissions.canView" data-on="click:view">ดู</button>
<button data-if="permissions.canEdit" data-on="click:edit">แก้ไข</button>
<button data-if="permissions.canDelete" data-on="click:delete">ลบ</button>
</div>สถานะการโหลด
<div class="data-container">
<!-- สถานะกำลังโหลด -->
<div data-if="isLoading" class="spinner animated">
<div class="loader"></div>
<p>กำลังโหลด...</p>
</div>
<!-- สถานะ error -->
<div data-if="!isLoading && error" class="error-message">
<p data-text="error.message"></p>
<button data-on="click:retry">ลองใหม่</button>
</div>
<!-- สถานะว่าง -->
<div data-if="!isLoading && !error && items.length === 0">
<p>ไม่พบรายการ</p>
</div>
<!-- เนื้อหา -->
<div data-if="!isLoading && !error && items.length > 0">
<ul data-for="item in items">
<template>
<li data-text="item.name"></li>
</template>
</ul>
</div>
</div>เงื่อนไขซ้อน
<div data-if="order">
<h2>รายละเอียดคำสั่งซื้อ</h2>
<div data-if="order.status === 'pending'">
<p class="warning">รอชำระเงิน</p>
<button data-on="click:pay">ชำระเงินตอนนี้</button>
</div>
<div data-if="order.status === 'completed'">
<p class="success">คำสั่งซื้อเสร็จสมบูรณ์</p>
<div data-if="order.hasReceipt">
<a data-attr="href:order.receiptUrl">ดาวน์โหลดใบเสร็จ</a>
</div>
</div>
</div>API อ้างอิง
Expression Operators
| Operator | ตัวอย่าง | คำอธิบาย |
|---|---|---|
! |
!isHidden |
Logical NOT |
&& |
a && b |
Logical AND |
\|\| |
a \|\| b |
Logical OR |
=== |
status === 'active' |
Strict equality |
!== |
type !== 'draft' |
Strict inequality |
>, <, >=, <= |
count > 0 |
Comparisons |
ค่า Truthy/Falsy
| Falsy | Truthy |
|---|---|
false |
true |
0 |
ตัวเลขที่ไม่ใช่ศูนย์ |
"" (string ว่าง) |
String ที่ไม่ว่าง |
null |
Objects, Arrays |
undefined |
Functions |
NaN |
ข้อควรระวัง
⚠️ 1. Element vs Display:none
<!-- data-if ลบ element ออกจาก DOM -->
<div data-if="show">เนื้อหา</div>
<!-- สำหรับแค่ซ่อน ใช้ CSS -->
<div data-style="{ display: show ? 'block' : 'none' }">เนื้อหา</div>
<div data-class="hidden:!show">เนื้อหา</div>⚠️ 2. การเข้าถึง Element ที่ถูกลบ
// ❌ Element อาจไม่มีเมื่อเงื่อนไขเป็น false
const elem = document.querySelector('[data-if]');
elem.textContent; // Error ถ้า element ถูกลบ
// ✅ ตรวจสอบก่อน
if (elem) {
elem.textContent;
}⚠️ 3. ประสิทธิภาพการสลับบ่อย
<!-- ❌ การสลับบ่อยอาจแพง -->
<div data-if="mouseOver">Tooltip</div>
<!-- ✅ ใช้ CSS สำหรับการสลับบ่อย -->
<div data-class="visible:mouseOver" class="tooltip">Tooltip</div>Directives ที่เกี่ยวข้อง
- data-for - สำหรับ render รายการ
- data-class - สำหรับ visibility ด้วย class
- data-style - สำหรับ visibility ด้วย style