0Pricing
Angular Academy · บทเรียน

สัญญาณที่คำนวณได้

คำนวณค่าที่อัปเดตโดยอัตโนมัติ

สัญญาณที่คำนวณได้ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สัญญาณที่คำนวณได้
  2. เอฟเฟกต์และผลข้างเคียง
  3. การเก็บกวาดเอฟเฟกต์และวงจรชีวิต
  4. linkedSignal และรูปแบบขั้นสูง
← กลับไปที่ Angular Academy