สัญญาณที่คำนวณได้
คำนวณค่าที่อัปเดตโดยอัตโนมัติ
สัญญาณที่คำนวณได้ เป็นบทเรียน Angular Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Angular Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Angular Academy มีบทเรียนทั้งหมด 4 บทเรียน
สัญญาณคำนวณคืออะไร
สัญญาณ computed() จะคำนวณค่าจากสัญญาณอื่นอย่างน้อยหนึ่งรายการ เมื่อสัญญาณต้นทางเปลี่ยนแปลง ค่าที่คำนวณจะถูกคำนวณใหม่แบบช้าตามต้องการ — เฉพาะเมื่อมีการอ่านค่าเท่านั้น
สัญญาณคำนวณเป็นแบบอ่านอย่างเดียว คุณไม่สามารถเรียกใช้ .set() กับสัญญาณเหล่านี้ได้
การสร้าง computed
ส่งฟังก์ชันให้กับ computed() Angular จะติดตามทุกสัญญาณที่คุณอ่านภายในฟังก์ชันนั้นโดยอัตโนมัติ
import { signal, computed } from '@angular/core';
const price = signal(100);
const quantity = signal(2);
const total = computed(() => price() * quantity());
console.log(total()); // 200การติดตามสิ่งที่ต้องพึ่งพาโดยอัตโนมัติ
คุณไม่ต้องประกาศสิ่งที่ต้องพึ่งพาด้วยตนเอง การอ่าน price() และ quantity() ภายในฟังก์ชันเรียกกลับจะลงทะเบียนทั้งสองรายการเป็นสิ่งที่ต้องพึ่งพาโดยอัตโนมัติ
หากมีการอ่านสัญญาณแบบมีเงื่อนไขและไม่ได้ไปถึงส่วนนั้น สัญญาณจะไม่ถูกติดตามในการทำงานรอบนั้น
const showTax = signal(false);
const tax = signal(20);
const base = signal(100);
const final = computed(() =>
showTax() ? base() + tax() : base()
);
// When showTax() is false, "tax" is NOT a dependencyการทำงานแบบช้าและการจดจำผลลัพธ์
ค่าคำนวณจะทำงานเมื่อถูกอ่านเท่านั้น และจะแคชผลลัพธ์ไว้ หากคุณอ่านค่านั้นสองครั้งโดยที่แหล่งข้อมูลไม่เปลี่ยน ฟังก์ชันจะทำงานเพียงครั้งเดียว
const a = signal(1);
const doubled = computed(() => {
console.log('recompute');
return a() * 2;
});
doubled(); // logs "recompute", returns 2
doubled(); // cached, returns 2, no logการเชื่อมโยงสัญญาณคำนวณ
สัญญาณคำนวณสามารถพึ่งพาสัญญาณคำนวณอื่น ๆ ได้ ทำให้เกิดกราฟปฏิกิริยา
const firstName = signal('Ada');
const lastName = signal('Lovelace');
const fullName = computed(() => firstName() + ' ' + lastName());
const greeting = computed(() => 'Hello, ' + fullName());
console.log(greeting()); // Hello, Ada Lovelaceการใช้ computed ในคอมโพเนนต์
สัญญาณคำนวณมีประโยชน์อย่างมากในคอมโพเนนต์ แม่แบบจะเรนเดอร์ใหม่เฉพาะเมื่อค่าที่คำนวณเปลี่ยนแปลงจริงเท่านั้น
import { Component, signal, computed } from '@angular/core';
@Component({
selector: 'app-cart',
template: '<p>Total: {{ total() }}</p>'
})
export class CartComponent {
items = signal([10, 20, 30]);
total = computed(() => this.items().reduce((a, b) => a + b, 0));
}ค่าคำนวณเป็นแบบอ่านอย่างเดียว
การพยายามกำหนดค่าให้สัญญาณคำนวณจะทำให้เกิดข้อผิดพลาดขณะคอมไพล์ สัญญาณเหล่านี้มีไว้เพื่อแสดงสถานะที่ได้จากการคำนวณเท่านั้น
const count = signal(0);
const doubled = computed(() => count() * 2);
// doubled.set(10); // ERROR: Property 'set' does not exist
count.set(5); // OK - update the source instead
console.log(doubled()); // 10ความเท่ากันและการข้ามการคำนวณใหม่
โดยค่าเริ่มต้น ค่าคำนวณจะใช้ Object.is ในการเปรียบเทียบ หากค่าคำนวณใหม่เท่ากับค่าเดิม ระบบจะไม่แจ้งให้สิ่งที่พึ่งพาค่านั้นทราบ เพื่อหลีกเลี่ยงการทำงานที่สูญเปล่า
const value = signal(2);
const isEven = computed(() => value() % 2 === 0);
// value 2 -> 4 -> 6 all yield isEven() === true
// Dependents of isEven do NOT re-run on those changesฟังก์ชันตรวจสอบความเท่ากันแบบกำหนดเอง
คุณสามารถส่งตัวเลือก equal เพื่อควบคุมว่าค่าคำนวณจะถือว่าเปลี่ยนแปลงเมื่อใด ซึ่งมีประโยชน์กับออบเจ็กต์หรืออาร์เรย์
const data = signal({ id: 1, name: 'A' });
const view = computed(
() => data(),
{ equal: (a, b) => a.id === b.id }
);
// Dependents re-run only when the id changesหลีกเลี่ยงผลข้างเคียงในค่าคำนวณ
ค่าคำนวณต้องบริสุทธิ์ ไม่มีการเรียก HTTP ไม่มีการบันทึกข้อมูลเป็นพฤติกรรม และไม่มีการเปลี่ยนแปลงสัญญาณอื่น ผลข้างเคียงควรอยู่ใน effect() การทำให้ค่าคำนวณบริสุทธิ์ช่วยให้กราฟปฏิกิริยาคาดเดาได้
ค่าคำนวณเทียบกับเมธอด
เมธอดในแม่แบบจะทำงานทุกครั้งที่เกิดรอบการตรวจจับการเปลี่ยนแปลง ส่วนค่าคำนวณจะทำงานเฉพาะเมื่อสิ่งที่พึ่งพาเปลี่ยนแปลง และจะจดจำผลลัพธ์ไว้ จึงมีประสิทธิภาพกว่ามากสำหรับค่าที่ได้จากการคำนวณ
// Method: recalculates every CD cycle
getTotal() { return this.items().reduce((a, b) => a + b, 0); }
// Computed: memoized, runs only on item change
total = computed(() => this.items().reduce((a, b) => a + b, 0));ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับสัญญาณคำนวณ
สรุป: สัญญาณคำนวณ
คุณได้เรียนรู้ว่า computed() สร้างสัญญาณที่ได้จากการคำนวณแบบอ่านอย่างเดียว พร้อมการติดตามสิ่งที่ต้องพึ่งพาโดยอัตโนมัติ การประเมินผลแบบช้า และการจดจำผลลัพธ์
- ทำให้สัญญาณเหล่านี้บริสุทธิ์ — ไม่มีผลข้างเคียง
- สัญญาณเหล่านี้สามารถพึ่งพาสัญญาณคำนวณอื่นได้
- ใช้
equalสำหรับการตรวจจับการเปลี่ยนแปลงแบบกำหนดเอง
ถัดไป: การทำงานของผลข้างเคียงด้วย effect()
คำถามที่พบบ่อย
บทเรียน “สัญญาณที่คำนวณได้” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สัญญาณที่คำนวณได้” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Angular Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Angular Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สัญญาณที่คำนวณได้”
คำนวณค่าที่อัปเดตโดยอัตโนมัติ คุณปฏิบัติ Angular Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Angular Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Angular Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “สัญญาณที่คำนวณได้” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Angular Academy นี้ได้ไหม
ได้ บทเรียน Angular Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ