عند إنشاء تطبيقات الويب الحديثة، يعد تحديث واجهة المستخدم (واجهة المستخدم) بكفاءة أمرًا ضروريًا للحفاظ على سرعة التطبيقات واستجابتها. إحدى الإستراتيجيات الشائعة المستخدمة في العديد من أطر العمل (مثل React) هي استخدام Virtual DOM والمكونات. تشرح هذه المقالة كيفية عرض المكونات باستخدام Virtual DOM وكيف يمكننا تحسين إعادة العرض حتى لا يصبح تطبيق الويب بطيئًا.
إن DOM (نموذج كائن المستند) عبارة عن بنية تشبه الشجرة تمثل جميع العناصر الموجودة في صفحة الويب. في كل مرة تتفاعل فيها مع صفحة ويب - بالنقر على الأزرار، وكتابة نص - يجب على المتصفح تحديث DOM، الأمر الذي قد يكون بطيئًا.
A DOM الافتراضي يشبه نسخة من DOM الحقيقي ولكنه يعيش فقط في الذاكرة. بدلاً من تحديث DOM الحقيقي مباشرةً في كل مرة يتغير فيها شيء ما، نقوم بتحديث Virtual DOM أولاً. بمجرد إجراء التغييرات، يقارن Virtual DOM نفسه بالإصدار القديم، ويبحث عن الاختلافات (وهذا ما يسمى diffing)، ويقوم فقط بتحديث أجزاء DOM الحقيقية التي تحتاج إلى التغيير.
في تطبيق الويب الحديث، تعد المكونات هي اللبنات الأساسية لواجهة المستخدم. فكر فيها كأجزاء صغيرة قابلة لإعادة الاستخدام من صفحة الويب. على سبيل المثال:
شجرة Virtual DOM التي تمثل واجهة المستخدم تلك. 3. مثال: إنشاء مكون زر
بسيط باستخدام الكود الكاذب. سيعود هذا المكون زرًا يحتوي على نص ووظيفة يتم تشغيلها عند النقر فوق الزر.
// مكون لعرض الزر
زر الوظيفة (الدعائم) {
// يقوم مكون الزر بإرجاع عقدة DOM افتراضية لعنصر
// Component to display a button function Button(props) { // The Button component returns a Virtual DOM node for a
يأخذ مكون الزر
وزر . يمكن تمثيل كل جزء من هذه الأجزاء كمكونات. يمكن أن تبدو بنية التطبيق كما يلي:
// مكون التطبيق برأس وزر
وظيفة التطبيق () {
إرجاع VirtualNode جديد ("div"، {}، [
رأس جديد ()، // مكون الرأس
new Button({ text: "Click Me"، onClick: HandleClick }) // مكون الزر
])
}
// مكون الرأس
رأس الوظيفة () {
إرجاع VirtualNode جديد ("h1"، {}، ["مرحبًا بك في التطبيق!"])
}
// وظيفة للتعامل مع نقرات الزر
وظيفة التعامل مع النقر () {
console.log("تم النقر على الزر!")
}
// App component with a header and button function App() { return new VirtualNode("div", {}, [ new Header(), // The Header component new Button({ text: "Click Me", onClick: handleClick }) // The Button component ]) } // Header component function Header() { return new VirtualNode("h1", {}, ["Welcome to the App!"]) } // Function to handle button clicks function handleClick() { console.log("Button clicked!") }يُرجع مكون التطبيق
// Initial render of the app function renderApp() { let virtualDOM = App() // Render the app's Virtual DOM let realDOM = createRealDOM(virtualDOM) // Convert the Virtual DOM into real DOM elements attachToPage(realDOM) // Attach the real DOM elements to the webpage }
من خلال تحديث الأجزاء التي تم تغييرها فقط. إليك ما يحدث عند حدوث إعادة العرض:
// مكون زر جديد بنص محدث
زر الوظيفة (الدعائم) {
إرجاع VirtualNode جديد ("button"، {onClick:props.onClick }، [props.text])
}
// إعادة العرض بالنص الجديد
دع oldButton = Button({ النص: "انقر فوقي"، onClick: HandleClick })
دع newButton = Button({ text: "تم النقر عليه!"، onClick: HandleClick })
// الفرق بين الزر القديم والجديد
دع diffResult = diff(oldButton, newButton)
// قم بتصحيح DOM الحقيقي بالتغييرات
التصحيح (realButtonDOM، diffResult)
// New Button component with updated text function Button(props) { return new VirtualNode("button", { onClick: props.onClick }, [props.text]) } // Re-rendering with the new text let oldButton = Button({ text: "Click Me", onClick: handleClick }) let newButton = Button({ text: "Clicked!", onClick: handleClick }) // Diff the old and new Button let diffResult = diff(oldButton, newButton) // Patch the real DOM with the changes patch(realButtonDOM, diffResult)يجب تحديث المكونات
أو state للمكون، فيمكننا تخطي إعادة تصيير هذا المكون. هذا هو المكان الذي يأتي فيه منطق shouldComponentUpdate.
// وظيفة للتحقق مما إذا كان يجب تحديث المكون
الدالة يجب ComponentUpdate(oldProps, newProps) {
return oldProps !== newProps // التحديث فقط إذا تغيرت الدعائم
}
// Function to check if a component should update function shouldComponentUpdate(oldProps, newProps) { return oldProps !== newProps // Only update if the props have changed }
// مثال: إعادة العرض الأمثل لمكون الزر
وظيفة renderButtonIfNeeded(oldButton, newButton) {
إذا (shouldComponentUpdate(oldButton.props, newButton.props)) {
دع realButton = createRealDOM(newButton)
التصحيح (زر حقيقي)
}
}
// Example: Optimized re-rendering of Button component function renderButtonIfNeeded(oldButton, newButton) { if (shouldComponentUpdate(oldButton.props, newButton.props)) { let realButton = createRealDOM(newButton) patch(realButton) } }
لتحديد كل عنصر بشكل فريد. يساعد هذا الخوارزمية المختلفة على مطابقة العناصر القديمة والجديدة في القائمة وتطبيق التغييرات الضرورية فقط.
// قائمة الأزرار ذات المفاتيح الفريدة
وظيفة ButtonList(العناصر) {
إرجاع VirtualNode جديد ("div"، {}، items.map(item =>
زر جديد ({مفتاح: item.id، نص: item.text، onClick: HandleClick })
))
}
// List of buttons with unique keys function ButtonList(items) { return new VirtualNode("div", {}, items.map(item => new Button({ key: item.id, text: item.text, onClick: handleClick }) )) }المفاتيح
، إذا تغير أحد العناصر في القائمة (مثل إضافة زر أو إزالته)، فيمكن للخوارزمية التعرف بسرعة على الزر الذي تم تغييره وتحديث هذا الزر فقط. 9. تحسين تغييرات الحالة
الخاصة بها. عندما تتغير حالة أحد المكونات، نريد فقط إعادة عرض هذا المكون المحدد، وليس التطبيق بأكمله. فيما يلي مثال لزر بالحالة:
// مكون الزر مع الحالة
وظيفة ButtonWithState() {
Let [clicked, setClicked] = useState(false) // إنشاء حالة للزر
وظيفة التعامل مع النقر () {
setClicked(true) // تحديث الحالة عند النقر عليها
}
إرجاع VirtualNode الجديد ("button"، { onClick: HandleClick }، [تم النقر عليه؟ "تم النقر عليه!" : "انقر فوقي"])
}
// Button component with state function ButtonWithState() { let [clicked, setClicked] = useState(false) // Create state for button function handleClick() { setClicked(true) // Update state when clicked } return new VirtualNode("button", { onClick: handleClick }, [clicked ? "Clicked!" : "Click Me"]) }
يتغير نص الزر عند النقر عليه.
// مكون التطبيق الأمثل
وظيفة التطبيق () {
إذا (!shouldComponentUpdate(oldHeaderProps, newHeaderProps)) {
return oldHeader // أعد استخدام الرأس القديم إذا لم يتغير
}
إرجاع VirtualNode جديد ("div"، {}، [
new Header(), // أعد عرض الرأس فقط إذا لزم الأمر
new ButtonWithState() // يُعاد عرض الزر بناءً على الحالة
])
}
// Optimized App component function App() { if (!shouldComponentUpdate(oldHeaderProps, newHeaderProps)) { return oldHeader // Reuse the old Header if it hasn't changed } return new VirtualNode("div", {}, [ new Header(), // Re-render the Header only if necessary new ButtonWithState() // Button re-renders based on state ]) }
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3