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

provide() ในคอมโพเนนต์แม่

การส่งค่าพื้นฐาน รีแอกทีฟรีฟ และออบเจ็กต์ พร้อมรักษาความเป็นรีแอกทีฟผ่าน provide

provide() ในคอมโพเนนต์แม่ เป็นบทเรียน Vue Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Vue Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Vue Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟังก์ชัน provide

Vue provide ช่วยให้คอมโพเนนต์ส่งข้อมูลให้คอมโพเนนต์ลูกหลานทั้งหมดได้ เรียกใช้ใน <script setup> พร้อมคีย์และค่า

import { provide } from "vue";
provide("message", "Hello from ancestor");

คอมโพเนนต์ลูกหลานใด ๆ ก็ฉีดค่าได้

เมื่อให้ค่าแล้ว คอมโพเนนต์ใด ๆ ที่อยู่ด้านล่างในแผนผังก็สามารถฉีดค่าด้วยคีย์เดียวกันได้ ไม่ว่าจะอยู่ลึกกี่ชั้น โดยไม่ต้องให้คอมโพเนนต์ระหว่างทางทำอะไร

App (provides "message")
  -> ... -> DeepChild (injects "message")

การให้สถานะที่ตอบสนอง

เพื่อให้คอมโพเนนต์ลูกหลานตอบสนองต่อการเปลี่ยนแปลงได้ ให้ส่ง ref หรือออบเจ็กต์ที่ตอบสนอง แทนค่าธรรมดา การอัปเดตค่าที่อ้างอิงจะส่งต่อไปยังผู้ใช้ทุกตัวโดยอัตโนมัติ

import { provide, ref } from "vue";
const theme = ref("dark");
provide("theme", theme);

การตอบสนองไหลลงด้านล่าง

เมื่อคอมโพเนนต์บรรพบุรุษเปลี่ยน theme.value คอมโพเนนต์ลูกหลานทุกตัวที่ฉีดค่านี้จะเรนเดอร์ใหม่ด้วยค่าใหม่ นี่คือข้อได้เปรียบสำคัญเมื่อเทียบกับการส่งสำเนาคงที่

function toggle() {
  theme.value = theme.value === "dark" ? "light" : "dark";
}

ปกป้องสถานะด้วย readonly

โดยค่าเริ่มต้น คอมโพเนนต์ลูกหลานอาจแก้ไขค่าอ้างอิงที่ฉีดเข้ามาได้ ซึ่งทำให้การเปลี่ยนแปลงสถานะกระจัดกระจายและทำลำดับการไหลของข้อมูลทางเดียวเสียหาย ให้ครอบค่าด้วย readonly() เพื่อให้ผู้ใช้ค่าอ่านได้แต่เขียนไม่ได้

import { provide, ref, readonly } from "vue";
const user = ref({ name: "Ada" });
provide("user", readonly(user));

ให้ฟังก์ชันเป็นการกระทำ

หากต้องการให้คอมโพเนนต์ลูกหลานร้องขอการเปลี่ยนแปลงได้ ให้ฟังก์ชันควบคู่ไปกับสถานะที่อ่านได้เท่านั้น ผู้ใช้ค่าจะเรียกใช้ฟังก์ชัน และมีเพียงผู้ให้ค่าเท่านั้นที่แก้ไขแหล่งข้อมูล

function updateName(name) {
  user.value.name = name;
}
provide("user", readonly(user));
provide("updateName", updateName);

รวมสถานะและการกระทำ

รูปแบบที่สะอาดคือการให้ค่าเป็นออบเจ็กต์เดียวซึ่งประกอบด้วยสถานะที่อ่านได้เท่านั้นและการกระทำของสถานะนั้น คล้ายกับที่เก็บสถานะขนาดเล็ก

provide("userStore", {
  user: readonly(user),
  updateName
});

provide ระดับแอป

คุณยังสามารถให้ค่าในระดับแอปได้ ทำให้ค่านั้นพร้อมใช้งานในทุกคอมโพเนนต์ โดยตั้งค่าเพียงครั้งเดียวบนอินสแตนซ์ของแอป (จะกล่าวถึงโดยละเอียดในภายหลัง)

app.provide("appName", "CoddyKit");

ใช้คีย์สัญลักษณ์เพื่อหลีกเลี่ยงการชนกัน

คีย์สตริงอาจชนกันในแอปขนาดใหญ่ ให้ใช้ Symbol ที่ส่งออกจากโมดูลส่วนกลางเป็นคีย์เพื่อรับประกันความไม่ซ้ำกัน

// keys.js
export const themeKey = Symbol("theme");
// provider:
provide(themeKey, theme);

เมื่อใดควรใช้ provide

provide เหมาะสำหรับ theme ผู้ใช้ปัจจุบัน การรองรับหลายภาษา formContext หรือการกำหนดค่าฟีเจอร์ ซึ่งเป็นค่าที่คอมโพเนนต์ทั้งส่วนย่อยต้องใช้ แต่หากมีเพียงหนึ่งหรือสองระดับ การใช้พร็อพธรรมดายังคงง่ายกว่า

ขอบเขตของผู้ให้ค่า

ค่าที่ให้ไว้จะมีขอบเขตอยู่ภายในส่วนย่อยของคอมโพเนนต์ผู้ให้ค่า ส่วนย่อยของคอมโพเนนต์พี่น้องสองส่วนสามารถให้ค่าที่ต่างกันภายใต้คีย์เดียวกันได้โดยไม่รบกวนกัน

ตรวจสอบความเข้าใจ

คุณจะป้องกันไม่ให้คอมโพเนนต์ลูกหลานแก้ไขสถานะที่ให้ไว้ได้อย่างไร

ทบทวน

คุณได้เรียนรู้ว่า provide(key, value) เปิดเผยข้อมูลให้คอมโพเนนต์ลูกหลานทั้งหมด ให้ค่าเป็น ref เพื่อคงการตอบสนอง ครอบค่าด้วย readonly() เพื่อป้องกันการแก้ไข ให้ฟังก์ชันเป็นการกระทำ และควรใช้คีย์ Symbol เพื่อหลีกเลี่ยงการชนกัน

คำถามที่พบบ่อย

บทเรียน “provide() ในคอมโพเนนต์แม่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “provide() ในคอมโพเนนต์แม่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Vue Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Vue Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “provide() ในคอมโพเนนต์แม่”

การส่งค่าพื้นฐาน รีแอกทีฟรีฟ และออบเจ็กต์ พร้อมรักษาความเป็นรีแอกทีฟผ่าน provide คุณปฏิบัติ Vue Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Vue Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Vue Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “provide() ในคอมโพเนนต์แม่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Vue Academy นี้ได้ไหม

ได้ บทเรียน Vue Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ปัญหาการส่งพร็อพส์ต่อทอดยาว
  2. provide() ในคอมโพเนนต์แม่
  3. inject() ในคอมโพเนนต์ลูก
  4. Provide/Inject สำหรับสถานะระดับแอป
← กลับไปที่ Vue Academy