ตัวอย่างของ Vanilla JSX
ถ้า JSX คืนค่าเป็นองค์ประกอบ DOM ล่ะ?
- ฟังก์ชัน
ClickMe มีหน้าที่สร้างปุ่มและแสดงจำนวนครั้งที่คลิก
- ทุกครั้งที่คลิกปุ่ม ข้อความจะถูกอัปเดต
export default function ClickMe() {
let i = 0;
const el = <button>Click me</button> as HTMLButtonElement;
el.onclick = (e) => {
el.textContent = `Clicked ${++i} times`;
};
return el;
}
การนำกลับมาใช้ซ้ำ
- สามารถใช้คอมโพเนนต์
ClickMe ได้หลายครั้ง โดยแต่ละตัวจะคงสถานะของตัวเองไว้
import ClickMe from "./sample1.js";
export default () => <>
<p><ClickMe /></p>
<p><ClickMe /></p>
<p><ClickMe /></p>
</>;
การสร้าง DOM tree แบบโต้ตอบได้
- สามารถใช้คลาส
TodoInput และ TodoList เพื่อจัดการรายการสิ่งที่ต้องทำได้
- เพิ่มรายการและคลิกเพื่อลบออกได้
function TodoInput(attrs: { add: (v: string) => void }) {
const input = <input /> as HTMLInputElement;
input.placeholder = 'Add todo item...';
input.onkeydown = (e) => {
if (e.key === 'Enter') {
attrs.add(input.value);
input.value = '';
}
};
return input;
}
class TodoList {
ul = <ul class='todolist' /> as HTMLUListElement;
add(v: string) {
const item = <li>{v}</li> as HTMLLIElement;
item.onclick = () => item.remove();
this.ul.append(item);
}
}
export default () => {
const list = new TodoList();
list.add('foo');
list.add('bar');
return <>
<TodoInput add={(v) => list.add(v)} />
{list.ul}
</>;
};
การประมวลผลข้อมูลขนาดใหญ่
- ฟังก์ชัน
FindNames ประมวลผลและกรองข้อมูลจำนวนมากเพื่อแสดงผลลัพธ์
- อัปเดตรายการที่ตรงกันแบบเรียลไทม์ตามค่าที่ป้อน
import { data } from "../fetch-dataset.js";
export default function FindNames() {
const status = <p style='margin:1em 0' /> as HTMLParagraphElement;
const results = <ul /> as HTMLUListElement;
const input = <input value='eri(c|k)a?' autocomplete='new-password' oninput={updateMatches} /> as HTMLInputElement;
updateMatches();
function updateMatches() {
const matched = (data.entries().filter(([k]) => k.match(input.value)).toArray());
const matches = (Iterator.from(matched).map(match => <Item regex={input.value} match={match} />).take(30));
results.replaceChildren(...matches);
status.textContent = `${matched.length} / ${data.size}`;
}
return <div class='sample4'>
{input}
{status}
{results}
</div>;
}
function Item(attrs: { match: [string, number], regex: string }) {
const [name, count] = attrs.match;
const total = <small style='color:#fff3'>({count})</small>;
return <li>
<span innerHTML={highlight(name, attrs.regex)} /> {total}
</li>;
}
function highlight(str: string, regex: string) {
if (!regex) return str;
const r = new RegExp(`(${regex})`, 'gi');
return str.replace(r, '<span class="match">$1</span>');
}
แนะนำ imlib
imlib เป็นไลบรารีที่พัฒนาขึ้นสำหรับ immaculatalibrary.com
- ถูกใช้ในการสร้าง minigamemaker.com และเว็บไซต์ที่คุณกำลังอ่านอยู่ในตอนนี้
- ถูกพัฒนาขึ้นเพราะสถานะเดิมที่มีอยู่นั้นไม่เพียงพอ และเป็นวิธีที่ผู้พัฒนาชอบที่สุดในการสร้างแอป
สรุปโดย GN⁺
- บทความนี้อธิบายวิธีสร้างและโต้ตอบกับองค์ประกอบ DOM โดยตรงด้วย JSX
- นำเสนอวิธีจัดการข้อมูลจำนวนมากอย่างมีประสิทธิภาพได้โดยไม่ต้องใช้ virtual DOM แบบเดิม
- ไลบรารี
imlib ช่วยให้พัฒนาแอปได้ด้วยวิธีที่เรียบง่ายและตรงไปตรงมา
- โปรเจกต์อื่นที่มีความสามารถคล้ายกัน ได้แก่ React, Vue.js เป็นต้น
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ขอบคุณที่สนใจโปรเจกต์นี้
ถ้าคืนค่าเป็นโหนด DOM จริง ข้อดีใหญ่ของ JSX ก็จะหายไป
ต้นกำเนิดของ JSX มาจาก XHP ของ Facebook
ตัวอย่างสุดท้ายไม่ทำงานบน Firefox
คล้ายกับ Vanilla TSX มาก
ทำให้นึกถึง Action Script 3
ตัวอย่างไม่ได้แสดงคอมโพเนนต์ที่มี props ซึ่งอาจเปลี่ยนไปตามเวลา
ฉันก็เคยสร้าง UI library ที่อิงกับนิพจน์เทมเพลต jsx ซึ่งสร้างโหนด DOM จริงเหมือนกัน
ไม่เข้าใจเสน่ห์ของ JSX
แนะนำ Imba