"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > الأخطاء الشائعة التي يرتكبها المطورون عند استخدام useState في React (وكيفية إصلاحها)

الأخطاء الشائعة التي يرتكبها المطورون عند استخدام useState في React (وكيفية إصلاحها)

تم النشر بتاريخ 2024-11-03
تصفح:387

Common Mistakes Developers Make with useState in React (And How to Fix Them)

يعد خطاف useState الخاص بـ React أداة أساسية لإدارة الحالة في المكونات الوظيفية، ولكن من السهل الوقوع في بعض الأخطاء الشائعة. سواء كنت بدأت للتو في استخدام React أو كنت تعمل معه لفترة من الوقت، فإن تجنب هذه الأخطاء يمكن أن ينقذك من الأخطاء غير المتوقعة ومشكلات الأداء.

دعونا نتعرف على 10 أخطاء متكررة وكيف يمكنك تجنبها لكتابة تعليمات برمجية أكثر وضوحًا وكفاءة.

1. نوع الحالة الأولية خاطئ

تنشأ إحدى المشكلات الأكثر شيوعًا عندما لا يتطابق نوع الحالة الأولي مع النوع المتوقع أثناء تحديثات الحالة.

❌ خطأ: عدم تطابق نوع الحالة الأولية

const [count, setCount] = useState(0);
setCount("1"); // Error: Argument of type 'string' is not assignable to parameter of type 'number'.

✅ الحل: استخدم TypeScript أو حدد النوع بشكل صريح.

const [count, setCount] = useState(0);
setCount(1); // No issues now.

2. عدم استخدام التحديثات الوظيفية

عند تحديث الحالة بناءً على القيمة السابقة، فإن الرجوع إلى الحالة الحالية مباشرة يمكن أن يؤدي إلى قيم قديمة، خاصة في العمليات غير المتزامنة.

❌ خطأ: استخدام الحالة الحالية مباشرة

setCount(count   1); // Can cause bugs in async scenarios.

✅ الحل: استخدم النموذج الوظيفي للتحديثات الآمنة.

setCount((prevCount) => prevCount   1); // Ensures you always have the latest value.

3. تخزين الحالة المشتقة

تجنب تخزين القيم في الحالة التي يمكن استخلاصها من حالة أو دعائم أخرى. يمكن أن يؤدي هذا إلى عمليات إعادة عرض غير ضرورية ومشكلات في المزامنة.

❌ خطأ: تخزين الحالة المشتقة

const [count, setCount] = useState(0);
const [doubleCount, setDoubleCount] = useState(count * 2);

✅ الحل: اشتق القيمة أثناء العرض بدلاً من استخدام الحالة.

const [count, setCount] = useState(0);
const doubleCount = count * 2; // No need to store this in state.

4. تحديثات الحالة داخل مرحلة العرض

استدعاء setState داخل مرحلة العرض هو وصفة لحلقات لا نهائية ومشكلات في الأداء.

❌ خطأ: تحديد الحالة أثناء التصيير

const [count, setCount] = useState(0);
setCount(1); // Infinite loop!

✅ الحل: تغيير حالة التشغيل في معالجات الأحداث أو التأثيرات.

const handleClick = () => setCount(1);

5. الدولة المتغيرة مباشرة

لن تكتشف React التغييرات إذا قمت بتغيير الحالة مباشرة، خاصة مع المصفوفات أو الكائنات.

❌ الخطأ: تغيير الحالة مباشرة

const [items, setItems] = useState([1, 2, 3]);
items.push(4); // Mutation happens here, React won’t re-render!

✅ الحل: قم بإرجاع مصفوفة أو كائن جديد لتشغيل عمليات إعادة العرض.

setItems((prevItems) => [...prevItems, 4]); // Spread to create a new array.

6. أنواع غير محددة أو غير صحيحة للحالة المعقدة

عند التعامل مع الحالة المعقدة، قد يؤدي عدم تحديد الأنواع المناسبة إلى حدوث مشكلات في وقت التشغيل والارتباك.

❌ الخطأ: الأنواع الضمنية يمكن أن تؤدي إلى أخطاء

const [user, setUser] = useState({ name: "", age: 0 });
setUser({ name: "John", age: "thirty" }); // Type error: Age should be a number.

✅ الحل: تحديد شكل الحالة بالأنواع الصحيحة.

type User = { name: string; age: number };
const [user, setUser] = useState({ name: "", age: 0 });

7. استخدام الحالة للقيم القابلة للتغيير (مثل الموقتات)

يؤدي استخدام useState للقيم التي لا تؤثر على العرض، مثل الموقتات، إلى عمليات إعادة عرض غير ضرورية.

❌ الخطأ: استخدام الحالة للقيم المتغيرة

const [timerId, setTimerId] = useState(null);

✅ الحل: استخدم useRef للقيم القابلة للتغيير التي لا تحتاج إلى إعادة العرض.

const timerIdRef = useRef(null);

8. عدم دمج كائنات الحالة بشكل صحيح

بخلاف مكونات الفئة، لا يقوم useState بدمج التحديثات تلقائيًا. يمكن أن يؤدي نسيان ذلك إلى الكتابة فوق أجزاء من حالتك.

❌ خطأ: الكتابة فوق الحالة بدلاً من الدمج

const [user, setUser] = useState({ name: '', age: 0 });
setUser({ age: 25 }); // The 'name' field is now lost!

✅ الحل: استخدم عامل الانتشار لدمج تحديثات الحالة.

setUser((prevUser) => ({ ...prevUser, age: 25 })); // Merges with existing state.

9. استخدام الحالة للتحديثات عالية التردد

قد يؤدي تتبع القيم عالية التردد مثل أبعاد النافذة في الحالة إلى حدوث مشكلات في الأداء بسبب عمليات إعادة العرض المفرطة.

❌ خطأ: استخدام الحالة للتحديثات المتكررة

const [size, setSize] = useState(window.innerWidth);
window.addEventListener("resize", () => setSize(window.innerWidth));

✅ الحل: استخدم useRef أو debounce لتقليل نتيجة الأداء.

const sizeRef = useRef(window.innerWidth);
useEffect(() => {
  const handleResize = () => {
    sizeRef.current = window.innerWidth;
  };
  window.addEventListener("resize", handleResize);
  return () => window.removeEventListener("resize", handleResize);
}, []);

10. افتراض أن تحديثات الحالة متزامنة

تحديثات حالة React غير متزامنة، لكن العديد من المطورين يفترضون خطأً أن التغييرات يتم تطبيقها على الفور.

❌ الخطأ: افتراض أن تغييرات الحالة فورية

setCount(count   1);
console.log(count); // Logs the old value, not the updated one!

✅ الحل: استخدم useEffect لتتبع تغييرات الحالة والتأكد من استخدام أحدث قيمة.

useEffect(() => {
  console.log(count); // Logs the updated value after re-render.
}, [count]);

الأفكار النهائية؟

سيؤدي تجنب مخاطر useState هذه إلى جعل كود React الخاص بك أكثر قوة وقابلية للقراءة والأداء. إن فهم كيفية عمل آلية حالة React ومعرفة أفضل الممارسات سيوفر لك الوقت في تصحيح الأخطاء ويعزز تجربة التطوير الشاملة.

هل لديك أي نصائح أو أخطاء تتعلق بـ useState لمشاركتها؟ قم بإسقاطها في التعليقات أدناه! ?

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/ujjwalkar21/common-mistakes-developers-make-with-usestate-in-react-and-how-to-fix-them-1cmi?1 إذا كان هناك أي انتهاك يرجى الاتصال بـ Study_golang @163.comdelete
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3