المقابلات التي تركز على الواجهة الأمامية غالبًا لا تهتم بـ DSA على الإطلاق.
وبالنسبة لأولئك منا الذين يتذكرون دراسة DSA في المدرسة/الكلية، كانت جميع الأمثلة تبدو خوارزمية بحتة (لسبب وجيه)، ولكن لم يكن هناك أي أمثلة أو إرشادات حول كيفية استفادة المنتجات التي نستخدمها كل يوم من هذا المفهوم.
"هل سأحتاج إلى هذا؟"
لقد سألت هذا كثيرًا، أليس كذلك؟ ?
إليك بعض هياكل البيانات التي يمكنك الاستفادة منها في تطبيق React الخاص بك اليوم! ?
القراءة ذات الصلة:
المصفوفات موجودة في كل مكان في React. إذا كنت بحاجة إلى مساعدة في فهم كيفية عمل .map() أو .filter()، فمن المحتمل أنك ترى هذا المنشور في وقت مبكر جدًا! لكن لا تقلق، بمجرد أن تعتاد على أساليب المصفوفة هذه، سترى مدى أهميتها في عرض القوائم، وإدارة حالات المكونات، وتحويل البيانات.
في تطبيق React، عندما تتعامل مع مجموعة كبيرة من الكيانات مثل المستخدمين أو المنشورات، فإن تطبيع بياناتك إلى كائنات (خرائط التجزئة) يمكن أن يجعل القراءة والتحديث أكثر كفاءة. بدلاً من العمل مع بنية متداخلة للغاية، يمكنك تعيين الكيانات حسب معرفاتها.
مثال: القراءة من متجر عادي باستخدام المعرفات
const postsById = { 1: { id: 1, title: 'First Post', content: 'Content of first post' }, 2: { id: 2, title: 'Second Post', content: 'Content of second post' } }; const postIds = [1, 2]; function PostList() { return ({postIds.map(id => (); } function Post({ post }) { return ())} ); }{post.title}
{post.content}
يسمح هذا النمط بالوصول الفعال إلى البيانات، خاصة مع مجموعات البيانات الكبيرة حيث يجب إجراء التحديثات أو القراءات بسرعة دون إعادة عرض المجموعة بأكملها.
تكون القوائم المرتبطة بشكل مزدوج مفيدة عندما تحتاج إلى سياق من كل من العناصر السابقة والتالية - فكر في التنقل في معرض الصور حيث تعرض كل صورة الصور المجاورة لها كمرجع. بدلاً من استخدام فهرس، سنقوم بتخزين العقدة الحالية مباشرة في حالة المكون.
مثال: قائمة مرتبطة بشكل مزدوج للتنقل بين العناصر ذات السياق
class Node { constructor(value) { this.value = value; this.next = null; this.prev = null; } } class DoublyLinkedList { constructor() { this.head = null; this.tail = null; } add(value) { const newNode = new Node(value); if (!this.head) { this.head = newNode; this.tail = newNode; } else { this.tail.next = newNode; newNode.prev = this.tail; this.tail = newNode; } } } const imageList = new DoublyLinkedList(); imageList.add({ id: 1, src: 'image1.jpg', alt: 'First Image' }); imageList.add({ id: 2, src: 'image2.jpg', alt: 'Second Image' }); imageList.add({ id: 3, src: 'image3.jpg', alt: 'Third Image' }); function Gallery() { const [currentNode, setCurrentNode] = useState(imageList.head); return ({currentNode.prev && ( )} {currentNode.next && ( )}); }
في مكون التفاعل هذا:
تسمح لك الحزم المكدسة بإدارة عمليات التراجع/الإعادة بكفاءة باستخدام منطق آخر ما يدخل، يخرج أولاً (LIFO). باستخدام العمليات غير القابلة للتغيير (concat، Slice)، يمكننا ضمان بقاء الحالة دون تغيير.
مثال: تراجع/إعادة باستخدام الدفع والبوب غير القابل للتغيير
const [undoStack, setUndoStack] = useState([]); const [redoStack, setRedoStack] = useState([]); const [formState, setFormState] = useState({ name: '', email: '' }); const updateForm = (newState) => { setUndoStack(prev => prev.concat([formState])); // Immutable push setRedoStack([]); // Clear redo stack setFormState(newState); }; const undo = () => { if (undoStack.length > 0) { const lastState = undoStack.at(-1); setUndoStack(prev => prev.slice(0, -1)); // Immutable pop setRedoStack(prev => prev.concat([formState])); // Move current state to redo setFormState(lastState); } }; const redo = () => { if (redoStack.length > 0) { const lastRedo = redoStack.at(-1); setRedoStack(prev => prev.slice(0, -1)); // Immutable pop setUndoStack(prev => prev.concat([formState])); // Push current state to undo setFormState(lastRedo); } };
تعمل قوائم الانتظار بطريقة الوارد أولاً، يخرج أولاً (FIFO) وهي رائعة لضمان معالجة المهام مثل مكالمات واجهة برمجة التطبيقات أو الإشعارات بالترتيب الصحيح.
مثال: استدعاءات واجهة برمجة التطبيقات في قائمة الانتظار
const [apiQueue, setApiQueue] = useState([]); const enqueueApiCall = (apiCall) => { setApiQueue(prevQueue => prevQueue.concat([apiCall])); // Immutable push }; const processQueue = () => { if (apiQueue.length > 0) { const [nextCall, ...restQueue] = apiQueue; nextCall().finally(() => setApiQueue(restQueue)); // Immutable pop } };
تُستخدم الأشجار بشكل شائع في React عند التعامل مع المكونات المتداخلة مثل سلاسل التعليقات، هياكل المجلدات، أو القوائم.
مثال: عرض شجرة التعليقات بشكل متكرر
const commentTree = { id: 1, text: "First comment", children: [ { id: 2, text: "Reply to first comment", children: [] }, { id: 3, text: "Another reply", children: [{ id: 4, text: "Nested reply" }] } ] }; function Comment({ comment }) { return (); }{comment.text}
{comment.children?.map(child => ())}
منشور شائع آخر قد يكون ذا صلة بك:
مثال 1: التوجيه بين طرق عرض متعددة
يمكنك تمثيل المسارات بين الصفحات كرسم بياني، مما يضمن مسارات تنقل مرنة في SPA.
const routesGraph = { home: ['about', 'contact'], about: ['home', 'team'], contact: ['home'], }; function navigate(currentRoute, targetRoute) { if (routesGraph[currentRoute].includes(targetRoute)) { console.log(`Navigating from ${currentRoute} to ${targetRoute}`); } else { console.log(`Invalid route from ${currentRoute} to ${targetRoute}`); } }
مثال 2: نمذجة علاقات المستخدم
تعتبر الرسوم البيانية مثالية لنمذجة الاتصالات الاجتماعية أو أي نوع من العلاقات حيث تكون كيانات متعددة مترابطة.
const usersGraph = { user1: ['user2', 'user3'], user2: ['user1', 'user4'], user3: ['user1'], user4: ['user2'] }; function findConnections(userId) { return usersGraph[userId] || []; } console.log(findConnections('user1')); // Outputs: ['user2', 'user3']
ملاحظة: نحن نستخدم الرسوم البيانية لإظهار تبعيات المراجع في البرامج الوسيطة.
ربما بدت فئات DSA هذه مجردة في الماضي، لكن هياكل البيانات تعمل على تشغيل العالم من حولك في React.
إن الكائنات والمكدسات وقوائم الانتظار والقوائم المرتبطة والأشجار والرسوم البيانية ليست مجرد نظرية - فهي العمود الفقري للتطبيقات النظيفة والفعالة والقابلة للتطوير التي تنشئها كل يوم.
لذا، في المرة القادمة التي تدير فيها الحالة في قائمة الانتظار أو تتعامل مع منطق واجهة المستخدم المعقد، تذكر: لقد تدربت على هذا منذ المدرسة. ?
أسمح لي أن أعرف ما هي هياكل البيانات التي تستخدمها أكثر من غيرها!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3